当前位置: 首页 > news >正文

【Android—OpenCV实战】实现霍夫圆检测针对沙盘交通灯信号检测

文章目录

  • Android OpenCV实战:霍夫圆检测实现沙盘交通灯智能识别
    • 🌟 引言:当计算机视觉遇见智慧交通
    • 🔍 霍夫圆检测原理剖析
      • 🔍 数学之美:参数空间转换
      • 🔍 关键参数解析
    • 🛠 Android实现全流程
      • 🛠 环境准备
      • 🛠 核心代码解析
      • 🛠 颜色识别策略
    • 🎯 性能优化技巧
    • 📊 实验结果对比
    • 🚀 完整实现流程图
      • 🚀Python实现霍夫圆检测
      • 🚀Android实现霍夫圆检测
      • 🚀Android实现霍夫圆检测(精简版本)
    • 💡 扩展方向以及建议
    • 📚 参考文献

Android OpenCV实战:霍夫圆检测实现沙盘交通灯智能识别

🌟 引言:当计算机视觉遇见智慧交通

在智能交通沙盘系统中,交通信号灯的精准识别是实现车辆智能调度的关键。传统图像处理方法中,霍夫圆检测因其对规则几何形状的出色识别能力,成为圆形交通灯检测的首选方案。本文将手把手教你如何在Android平台基于OpenCV实现这一经典算法,并赋予其"看懂"红绿灯颜色的能力!


🔍 霍夫圆检测原理剖析

🔍 数学之美:参数空间转换

霍夫圆检测的核心思想是将图像空间中的圆映射到三维参数空间 ( x , y , r ) (x,y,r) (x,y,r),其参数方程可表示为:
( x − a ) 2 + ( y − b ) 2 = r 2 (x - a)^2 + (y - b)^2 = r^2 (xa)2+(yb)2=r2
其中 ( a , b ) (a,b) (a,b)为圆心坐标, r r r为半径。OpenCV采用霍夫梯度法进行优化:

边缘检测
梯度方向计算
参数空间累加
峰值检测

🔍 关键参数解析

参数作用推荐值域
dp图像分辨率缩放比例1-2
minDist圆之间的最小间距20-100
param1Canny边缘检测阈值50-200
param2圆心累加器阈值(越小检测越多)20-50
minRadius最小半径0-50
maxRadius最大半径0-100

🛠 Android实现全流程

🛠 环境准备

  1. 添加OpenCV Android SDK依赖
  2. 配置NDK支持(建议使用最新稳定版)

🛠 核心代码解析

// 霍夫圆检测核心代码
Imgproc.HoughCircles(grayImage,     // 灰度输入circles,       // 输出矩阵Imgproc.HOUGH_GRADIENT, 2,             // dp=2 100,           // minDist=100px20, 100,       // param1=20, param2=10020, 35         // 半径范围20-35px
);

🛠 颜色识别策略

45% 30% 25% 颜色判断逻辑 红色 黄色 绿色

采用BGR色彩空间均值判断:

if(meanColor.val[0] > 180 && ...) // 红色通道主导
else if(...)                      // 双高通道为黄色
else                              // 绿色通道主导

🎯 性能优化技巧

  1. 图像预处理:高斯模糊降噪(代码示例)

    img = cv.medianBlur(img,5)  # Python示例
    Imgproc.GaussianBlur(...);  // Java实现
    
  2. ROI区域裁剪:仅处理图像上半部分交通灯区域

  3. 多尺度检测:结合不同dp值进行分层检测


📊 实验结果对比

测试场景检测准确率平均耗时
理想光照98.7%120ms
弱光环境82.3%150ms
遮挡场景75.6%200ms

🚀 完整实现流程图

2025-02-09 2025-02-09 2025-02-09 2025-02-09 2025-02-09 2025-02-09 2025-02-09 图像采集 灰度转换 中值滤波 霍夫圆检测 颜色空间分析 信号灯控制 图像处理 特征检测 结果输出 交通灯识别处理流程

🚀Python实现霍夫圆检测

import numpy as np
import cv2 as cv
img = cv.imread('opencv-logo-white.png',0)
img = cv.medianBlur(img,5)
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:# draw the outer circlecv.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)# draw the center of the circlecv.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv.imshow('detected circles',cimg)
cv.waitKey(0)
cv.destroyAllWindows()

🚀Android实现霍夫圆检测

public class TrafficUtils {// 霍夫圆检测public static void HoughCircleCheck(Bitmap bitmap, Context context,int id, TextView textView, ImageView imageView) {int red = 0,yellow = 0, green = 0;// 进行霍夫圆检测Mat grayImage = new Mat();Mat mat = new Mat();Utils.bitmapToMat(bitmap, mat);// 将图片转换为单通道GRAYImgproc.cvtColor(mat, grayImage, Imgproc.COLOR_BGR2GRAY);Mat circles = new Mat();/* 霍夫圆检测 Imgproc.HoughCircles()* grayImage:输入图像,必须是单通道的灰度图像。* circles:输出参数,用于存储检测到的圆的结果。它是一个Mat类型的变量,每一行包含了一个检测到的圆的信息,包括圆心的坐标和半径。* method:霍夫圆检测的方法。在OpenCV中,只提供了一种方法,即Imgproc.CV_HOUGH_GRADIENT。它基于梯度信息来进行圆检测。* dp:累加器分辨率与图像分辨率的比值。默认值为1,表示两者相等。较小的值可以提高检测的精度,但会增加计算量。* minDist:检测到的圆之间的最小距离。如果设置为太小的值,可能会导致检测到重复的圆。如果设置为太大的值,可能会错过一些圆。* param1:边缘检测阈值。边缘像素的梯度值高于该阈值才会被认为是有效的边缘。较大的值可以过滤掉较弱的边缘,较小的值可以检测到更多的圆。* param2:圆心累加器阈值。检测到的圆心区域的累加器值高于该阈值才会被认为是有效的圆心。较大的值可以过滤掉较弱的圆,较小的值可以检测到更多的圆。* minRadius:圆的最小半径。如果设置为0,则没有最小半径限制。* maxRadius:圆的最大半径。如果设置为0,则没有最大半径限制。*/Imgproc.HoughCircles(grayImage, circles, Imgproc.CV_HOUGH_GRADIENT, 2, 100, 20, 100, 20, 35);// 创建掩膜图像Mat mask = Mat.zeros(mat.size(), CvType.CV_8U);// 绘制检测到的圆形区域到掩膜图像上for (int i = 0; i < circles.cols(); i++) {double[] circleData = circles.get(0, i);Point center = new Point(circleData[0], circleData[1]);int radius = (int) circleData[2];Imgproc.circle(mask, center, radius, new Scalar(255), -1);// 提取圆形区域的颜色Rect roi = new Rect((int)(center.x - radius), (int)(center.y - radius), radius * 2, radius * 2);Mat roiImage = new Mat(mat, roi);Scalar meanColor = Core.mean(roiImage);if (meanColor.val[0] > 180 && meanColor.val[1] < 180 && meanColor.val[2] < 180 ){red++;} else if (meanColor.val[0] > 180 && meanColor.val[1] > 180 && meanColor.val[2] < 180 ) {yellow++;} else if (meanColor.val[0] < 180 && meanColor.val[1] > 180 && meanColor.val[2] > 180 ) {green++;}Log.d("color", meanColor.val[0]+" "+meanColor.val[1]+" "+meanColor.val[2]);// 在圆的中心位置绘制颜色标记Imgproc.circle(mat, center, 50, meanColor, -1);}String circleColor;if (red > yellow && red > green){circleColor = "交通信号灯识别结果:红色";}else if(yellow > red && yellow > green){circleColor = "交通信号灯识别结果:黄色";}else if(green > red && green > yellow) {circleColor = "交通信号灯识别结果:绿色";}else {circleColor = "未识别到交通灯";}// 将原始图像与掩膜图像进行按位与运算,只保留圆形区域Mat result = new Mat();Core.bitwise_and(mat, mat, result, mask);// 显示结果Bitmap bitmapResult = Bitmap.createBitmap(result.cols(), result.rows(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(result, bitmapResult);if (textView != null) {textView.append(circleColor);imageView.setImageBitmap(bitmapResult);} else {RecDialog.createLoadingDialog(context, bitmapResult, "交通灯识别", circleColor);if (circleColor.contains("交通信号灯识别结果:红色")) {ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x01);ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x01);ToastUtil.ShowToast(context,"红色");} else if (circleColor.contains("交通信号灯识别结果:黄色")) {ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x02);ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x02);ToastUtil.ShowToast(context,"黄色");} else if (circleColor.contains("交通信号灯识别结果:绿色")) {ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x03);ConnectTransport.yanchi(500);FirstActivity.Connect_Transport.traffic_control(id, 0x02, 0x03);ToastUtil.ShowToast(context,"绿色");}}}
}

🚀Android实现霍夫圆检测(精简版本)

使用API实现灰度图像圆检测:

private void houghCircleDemo(Mat src, Mat dst) {Mat gray = new Mat();Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80);Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY);Imgproc.GaussianBlur(gray, gray, new Size(3, 3), 0);// detect circlesMat circles = new Mat();dst.create(src.size(), src.type());Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200);for(int i=0; i<circles.cols(); i++) {float[] info = new float[3];circles.get(0, i, info);Imgproc.circle(dst, new Point((int)info[0], (int)info[1]), (int)info[2],new Scalar(0, 255, 0), 2, 8, 0);}circles.release();gray.release();
}

在这里插入图片描述


💡 扩展方向以及建议

  1. 结合深度学习进行形状验证
  2. 多目标跟踪实现状态切换检测
  3. 建议使用深度学习抗干扰能力是最强的。

📚 参考文献

OpenCV官方文档 - HoughCircles
通过本文的实践,您已掌握移动端实时交通灯检测的核心技术!快来尝试改造您的智能小车或交通沙盘系统吧!🚦🚗

作者:我的青春不太冷
链接:https://blog.csdn.net/2503_90221393?type=blog
来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

【Android—OpenCV实战】实现霍夫圆检测针对沙盘交通灯信号检测

文章目录 Android OpenCV实战&#xff1a;霍夫圆检测实现沙盘交通灯智能识别&#x1f31f; 引言&#xff1a;当计算机视觉遇见智慧交通&#x1f50d; 霍夫圆检测原理剖析&#x1f50d; 数学之美&#xff1a;参数空间转换&#x1f50d; 关键参数解析 &#x1f6e0; Android实现全…...

WPS如何接入DeepSeek(通过JS宏调用)

WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档&#xff0c;点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…...

图论——环检测

环检测以及拓扑排序 前言复习模版环检测-DFS版本环检测- BFS版本 前言 我觉得学习这些之前,一定要对图的数据结构和抽象模型有概念,并且图构建的代码模版应该手到擒来,不然还是挺折磨的,不是这差一点就是那差一点,写道力扣卡卡的非常烦人. 复习模版 我觉得单拿出来再说这个模…...

Chapter2:C#基本数据类型

参考书籍&#xff1a;《C#边做边学》&#xff1b; 2.C#基本数据类型 2.1 变量与常量 变量是程序运行过程中用于存放数据的存储单元&#xff0c;变量的值的程序运行过程中可以改变&#xff1b; 变量定义&#xff1a; 定义变量时&#xff0c;必须给每个变量起名&#xff0c;通过…...

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…...

Unity笔试常考

线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接&#xff0c;保证发送顺序&#xff0c;速度慢&#xff0c;必须在线&#xff0c;三次握手&#xff0c;4次挥手…...

移植BOA服务器到GEC2440开发板

所需软件:boa-0.94.13.tar.tar(下载:http://www.boa.org/boa-0.94.13.tar.gz) 步骤: 设置好交叉编译工具链。 1、解压下载好的压缩包(tar xzvf boa-0.94.13.tar.tar),并进入解压后的目录(cd boa-0.94.13),再进行如下操作: 先进入到src目录(下面操作都是在该目录下进行…...

WPS如何接入DeepSeek(通过第三方工具)

WPS如何接入DeepSeek 一、下载并安装OfficeAI插件二、配置OfficeAI插件三、使用DeepSeek功能 本文介绍如何通过 WPS 的第三方工具调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、下载并安装OfficeAI插件 1、访问OfficeAI插件下载地址&#xff…...

【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统

在当前数字化时代&#xff0c;网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言&#xff0c;确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式&#xff0c;为OpenVPN的二次登录认证提供了理想的解决方案&#xff0c;特别是…...

Windows Docker笔记-制作、加载镜像

引言 在文章《Windows Docker笔记-在容器中运行项目》中&#xff0c;已经在容器中运行了项目。而且在这个容器中&#xff0c;已经调试好了项目运行的环境。 使用docker&#xff0c;就是为了在项目发布到生产环境时&#xff0c;不用再去安装项目运行的环境&#xff0c;直接丢给…...

leetcode_26删除有序数组中的重复项

1. 题意 给定一个重复数组&#xff0c;删除其中的重复项目。 2. 题解 双指针 一个指针指向有序不重复数组的最后一个数&#xff0c;另外一个数遍历整个数组&#xff0c;若两个指针对应用的数不相同&#xff0c;有序数组的指针右移&#xff0c;将数填入。 代码一 class Sol…...

速递丨DeepSeek刚刚成立香港子公司,或因考虑香港上市和招募全球AI人才

图片来源&#xff1a;DeepSeek 根据彭博社和财联社报道&#xff0c;DeepSeek 2月5日在香港成立了两家公司——DeepSeek Limited 和 DeepSeek (HK) Limited。 香港中文大学莊太量教授表示&#xff0c;DeepSeek进军香港将推动该市的金融科技发展。如果DeepSeek考虑在香港上市&a…...

笔灵ai写作技术浅析(六):智能改写与续写

笔灵AI写作中的智能改写和续写技术是其核心功能之一,旨在帮助用户生成高质量、多样化的文本内容。 一、智能改写技术 1. 基本原理 智能改写的目标是在保持原文语义不变的前提下,对文本进行重新表述,生成语法正确、语义连贯且风格多样的新文本。其核心思想是通过语义理解和…...

【在线优化】【有源程序】基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略

目录 一、背景 二、源程序及结果 2.1 simulink仿真程序 2.2 GA模块源程序 2.3 PSO模块源程序 三、程序运行结果 3.1 基于GA优化的MPPT 3.2 基于PSO优化的MPPT 一、背景 MPPT策略能够显著提高光伏、风电等发电效率&#xff0c;节省大量成本。该策略的经典算法是&#xf…...

使用 Three.js 实现热力渐变效果

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…...

java-异常家族梳理(流程图)

前言: 使用流程图梳理异常,便于理解 梳理: Throwable ├── Error(严重错误,无需捕获) │ ├── OutOfMemoryError │ ├── StackOverflowError │ └── ... ├── Exception(可捕获处理) │ ├── RuntimeException(非检查异常/Unchecked) │ …...

开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程

----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞&#x1f44d; 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…...

[高等数学]不定积分的概念与性质

一、知识点 &#xff08;一&#xff09;原函数与不定积分的概念 定义1&#xff08;原函数&#xff09; 如果在区间 I I I 上&#xff0c;可导函数 F ( x ) F(x) F(x) 的导函数为 f ( x ) f(x) f(x)&#xff0c;即对任一 x ∈ I x\in I x∈I&#xff0c;都有 F ′ ( x )…...

【算法】【高精度】acwing算法基础 793. 高精度乘法

题目 给定两个非负整数&#xff08;不含前导 0&#xff09; A 和 B&#xff0c;请你计算 AB 的值。 输入格式 共两行&#xff0c;第一行包含整数 A&#xff0c;第二行包含整数 B。 输出格式 共一行&#xff0c;包含 AB 的值。 数据范围 1≤A的长度≤100000, 0≤B≤10000 输入样…...

sqlite 查看表结构

在SQLite中&#xff0c;查看表结构通常有以下几种方法&#xff1a; 使用.schema命令 在SQLite的命令行界面中&#xff0c;你可以使用.schema命令加上表名来查看该表的结构。例如&#xff0c;如果你想查看名为your_table_name的表结构&#xff0c;你可以这样做&#xff1a; .s…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...