【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…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...