【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 (x−a)2+(y−b)2=r2
其中 ( a , b ) (a,b) (a,b)为圆心坐标, r r r为半径。OpenCV采用霍夫梯度法进行优化:
🔍 关键参数解析
参数 | 作用 | 推荐值域 |
---|---|---|
dp | 图像分辨率缩放比例 | 1-2 |
minDist | 圆之间的最小间距 | 20-100 |
param1 | Canny边缘检测阈值 | 50-200 |
param2 | 圆心累加器阈值(越小检测越多) | 20-50 |
minRadius | 最小半径 | 0-50 |
maxRadius | 最大半径 | 0-100 |
🛠 Android实现全流程
🛠 环境准备
- 添加OpenCV Android SDK依赖
- 配置NDK支持(建议使用最新稳定版)
🛠 核心代码解析
// 霍夫圆检测核心代码
Imgproc.HoughCircles(grayImage, // 灰度输入circles, // 输出矩阵Imgproc.HOUGH_GRADIENT, 2, // dp=2 100, // minDist=100px20, 100, // param1=20, param2=10020, 35 // 半径范围20-35px
);
🛠 颜色识别策略
采用BGR色彩空间均值判断:
if(meanColor.val[0] > 180 && ...) // 红色通道主导
else if(...) // 双高通道为黄色
else // 绿色通道主导
🎯 性能优化技巧
-
图像预处理:高斯模糊降噪(代码示例)
img = cv.medianBlur(img,5) # Python示例 Imgproc.GaussianBlur(...); // Java实现
-
ROI区域裁剪:仅处理图像上半部分交通灯区域
-
多尺度检测:结合不同dp值进行分层检测
📊 实验结果对比
测试场景 | 检测准确率 | 平均耗时 |
---|---|---|
理想光照 | 98.7% | 120ms |
弱光环境 | 82.3% | 150ms |
遮挡场景 | 75.6% | 200ms |
🚀 完整实现流程图
🚀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();
}
💡 扩展方向以及建议
- 结合深度学习进行形状验证
- 多目标跟踪实现状态切换检测
- 建议使用深度学习抗干扰能力是最强的。
📚 参考文献
OpenCV官方文档 - HoughCircles | |
---|---|
通过本文的实践,您已掌握移动端实时交通灯检测的核心技术!快来尝试改造您的智能小车或交通沙盘系统吧!🚦🚗 |
作者:我的青春不太冷
链接:https://blog.csdn.net/2503_90221393?type=blog
来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章:

【Android—OpenCV实战】实现霍夫圆检测针对沙盘交通灯信号检测
文章目录 Android OpenCV实战:霍夫圆检测实现沙盘交通灯智能识别🌟 引言:当计算机视觉遇见智慧交通🔍 霍夫圆检测原理剖析🔍 数学之美:参数空间转换🔍 关键参数解析 🛠 Android实现全…...

WPS如何接入DeepSeek(通过JS宏调用)
WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型,实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档,点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…...
图论——环检测
环检测以及拓扑排序 前言复习模版环检测-DFS版本环检测- BFS版本 前言 我觉得学习这些之前,一定要对图的数据结构和抽象模型有概念,并且图构建的代码模版应该手到擒来,不然还是挺折磨的,不是这差一点就是那差一点,写道力扣卡卡的非常烦人. 复习模版 我觉得单拿出来再说这个模…...
Chapter2:C#基本数据类型
参考书籍:《C#边做边学》; 2.C#基本数据类型 2.1 变量与常量 变量是程序运行过程中用于存放数据的存储单元,变量的值的程序运行过程中可以改变; 变量定义: 定义变量时,必须给每个变量起名,通过…...

kafka服务端之控制器
文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controler),它负责管理整个集群中所有分区和副本的状态。…...

Unity笔试常考
线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接,保证发送顺序,速度慢,必须在线,三次握手,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 大模型,实现自动化文本扩写、校对和翻译等功能。 一、下载并安装OfficeAI插件 1、访问OfficeAI插件下载地址ÿ…...

【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统
在当前数字化时代,网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言,确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式,为OpenVPN的二次登录认证提供了理想的解决方案,特别是…...
Windows Docker笔记-制作、加载镜像
引言 在文章《Windows Docker笔记-在容器中运行项目》中,已经在容器中运行了项目。而且在这个容器中,已经调试好了项目运行的环境。 使用docker,就是为了在项目发布到生产环境时,不用再去安装项目运行的环境,直接丢给…...
leetcode_26删除有序数组中的重复项
1. 题意 给定一个重复数组,删除其中的重复项目。 2. 题解 双指针 一个指针指向有序不重复数组的最后一个数,另外一个数遍历整个数组,若两个指针对应用的数不相同,有序数组的指针右移,将数填入。 代码一 class Sol…...

速递丨DeepSeek刚刚成立香港子公司,或因考虑香港上市和招募全球AI人才
图片来源:DeepSeek 根据彭博社和财联社报道,DeepSeek 2月5日在香港成立了两家公司——DeepSeek Limited 和 DeepSeek (HK) Limited。 香港中文大学莊太量教授表示,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策略能够显著提高光伏、风电等发电效率,节省大量成本。该策略的经典算法是…...
使用 Three.js 实现热力渐变效果
大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...
java-异常家族梳理(流程图)
前言: 使用流程图梳理异常,便于理解 梳理: Throwable ├── Error(严重错误,无需捕获) │ ├── OutOfMemoryError │ ├── StackOverflowError │ └── ... ├── Exception(可捕获处理) │ ├── RuntimeException(非检查异常/Unchecked) │ …...

开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程
----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞👍 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…...
[高等数学]不定积分的概念与性质
一、知识点 (一)原函数与不定积分的概念 定义1(原函数) 如果在区间 I I I 上,可导函数 F ( x ) F(x) F(x) 的导函数为 f ( x ) f(x) f(x),即对任一 x ∈ I x\in I x∈I,都有 F ′ ( x )…...
【算法】【高精度】acwing算法基础 793. 高精度乘法
题目 给定两个非负整数(不含前导 0) A 和 B,请你计算 AB 的值。 输入格式 共两行,第一行包含整数 A,第二行包含整数 B。 输出格式 共一行,包含 AB 的值。 数据范围 1≤A的长度≤100000, 0≤B≤10000 输入样…...
sqlite 查看表结构
在SQLite中,查看表结构通常有以下几种方法: 使用.schema命令 在SQLite的命令行界面中,你可以使用.schema命令加上表名来查看该表的结构。例如,如果你想查看名为your_table_name的表结构,你可以这样做: .s…...

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

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

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

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...