圆形检测算法-基于颜色和形状(opencv)

简介: 该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。

```
import cv2
import numpy as np

圆检测算法

def detect(img):

# 定义红色、蓝色、白色的hsv区间文件
red1 = np.array([0, 100, 46])
red2 = np.array([8, 255, 255])

white1 = np.array([0, 0, 221])
white2 = np.array([180, 30, 255])

blue1 = np.array([100, 43, 46])
blue2 = np.array([124, 255, 255])
# 从rgb转到hsv颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 找到每个像素的值,得到对应的单色图像
mask_red = cv2.inRange(hsv, red1, red2)
mask_white = cv2.inRange(hsv, white1, white2)
mask_blue = cv2.inRange(hsv, blue1, blue2)

result_red = cv2.bitwise_and(img, img, mask=mask_red)
result_white = cv2.bitwise_and(img, img, mask=mask_white)
result_blue = cv2.bitwise_and(img, img, mask=mask_blue)

# 对图像进行灰度化
gray_red = cv2.cvtColor(result_red, cv2.COLOR_BGR2GRAY)
gray_white = cv2.cvtColor(result_white, cv2.COLOR_BGR2GRAY)
gray_blue = cv2.cvtColor(result_blue, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行轮廓提取,更加面积,去除较大或较小面积,保存和圆相同的面积轮廓
_, contours, heridency = cv2.findContours(gray_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
_, contours2, heridency = cv2.findContours(gray_white, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 定义绘制字体
font = cv2.FONT_HERSHEY_SIMPLEX
# 红色轮廓
for i in contours:
    # 计算轮廓面积
    area = cv2.contourArea(i)
    # 当面积在500-2000之间,才进行圆检测
    if 500 < area < 2000:
        circles_red = cv2.HoughCircles(gray_red, cv2.HOUGH_GRADIENT, 1,
                                       50, param1=150, param2=20, minRadius=5, maxRadius=14)
        # 若不为空,则进行绘制
        if circles_red is not None:
            circles_1 = np.uint16(np.around(circles_red))
            for i in circles_1[0, :]:
                cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2)  # 画圆
                cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 2)  # 画圆心
                cv2.putText(img, 'red', (i[0], i[1]), font, 0.8, (0, 0, 255), 2)
# 白色轮廓
for i in contours2:
    area = cv2.contourArea(i)
    if 350 < area < 1500:

        circles_white = cv2.HoughCircles(gray_white, cv2.HOUGH_GRADIENT, 1,
                        20, param1=35, param2=20, minRadius=0, maxRadius=30)

        if circles_white is not None:
            circles_2 = np.uint16(np.around(circles_white))
            for i in circles_2[0, :]:
                cv2.circle(img, (i[0], i[1]), i[2], (255, 255, 255), 2)  # 画圆
                cv2.circle(img, (i[0], i[1]), 2, (255, 255, 255), 2)  # 画圆心
                cv2.putText(img, 'white', (i[0], i[1]), font, 0.8, (255, 255, 255), 2)

# 因蓝色轮廓较少,所以不需要进行轮廓提取
circles_blue = cv2.HoughCircles(gray_blue, cv2.HOUGH_GRADIENT, 1,
                        50, param1=35, param2=20, minRadius=5, maxRadius=25)

if circles_blue is not None:
    circles_3 = np.uint16(np.around(circles_blue))
    for i in circles_3[0, :]:
        cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 2)  # 画圆
        cv2.circle(img, (i[0], i[1]), 2, (255, 0, 0), 2)  # 画圆心
        cv2.putText(img, 'blue', (i[0], i[1]), font, 0.8, (255, 0, 0), 2)

return img
AI 代码解读

cap = cv2.VideoCapture('demo/DSC_0001.MOV')

while(cap.isOpened()):
ret, frame = cap.read()
frame = cv2.resize(frame, (640, 480))
result = detect(frame)
cv2.imshow('frame', result)
if cv2.waitKey(25) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

目录
打赏
0
0
0
0
5
分享
相关文章
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
145 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
面向办公室屏幕监控系统的改进型四叉树屏幕变化检测算法研究
本文提出一种改进型四叉树数据结构模型,用于优化办公室屏幕监控系统。通过动态阈值调节、变化优先级索引及增量更新策略,显著降低计算复杂度并提升实时响应能力。实验表明,该算法在典型企业环境中将屏幕变化检测效率提升40%以上,同时减少资源消耗。其应用场景涵盖安全审计、工作效能分析及远程协作优化等,未来可结合深度学习实现更智能化的功能。
37 0
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
334 1
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
214 10
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等