圆形检测算法-基于颜色和形状(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

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()

目录
相关文章
|
3天前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
20 1
|
10天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
2天前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
9 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
3天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
11 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
18天前
|
算法 安全
分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
本课题通过Simulink建模与仿真,实现OVP-UVP、OFP-UFP算法及AFD检测算法的反孤岛检测。OVP-UVP基于电压幅值变化,OFP-UFP基于频率变化,而AFD则通过注入频率偏移信号来检测孤岛效应,确保电力系统安全稳定运行。系统使用MATLAB 2013b进行建模与仿真验证。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
2月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
257 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
2月前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
2月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第5天
|
2月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第8天