Opencv-霍夫圆检测-代码解析

这篇具有很好参考价值的文章主要介绍了Opencv-霍夫圆检测-代码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

前言

一、霍夫圆检测代码

二、函数解析

1.cv2.HoughCircles函数

2.双边滤波:bilateralFilter() 函数

3.形态学操作-开运算

 4.cv2.circle()-画圆

5.cv2.putText函数

6.opencv的RGB 颜色表

7.cv2.imshow和cv2.waitKey函数

 ​编辑

8.霍夫圆思路

总结


前言

  刚入门opencv时,霍夫圆检测是一个很好的练手项目,下面我将会展示代码,并对函数进行解析。

一、霍夫圆检测代码

import numpy as np
import cv2


cap =cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))  #前一个代表用4个字符表示的视频编码格式  #后一个为保存的视频格式

# ret = cap.set(3, 640)  # 设置帧宽
# ret = cap.set(4, 480)  # 设置帧高
font = cv2.FONT_HERSHEY_SIMPLEX  # 设置字体样式
kernel = np.ones((5, 5), np.uint8)  # 卷积核

if cap.isOpened() is True:  # 检查摄像头是否正常启动
    while True:
        ret, frame = cap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   # 转换为灰色通道
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 转换为HSV空间

        #  消除噪声
        opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)  # 形态学开运算
        bila = cv2.bilateralFilter(opening, 10, 100, 200)  # 双边滤波消除噪声
        edges = cv2.Canny(opening, 50, 100)  # 边缘识别
        # 识别圆形
        circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=75, minRadius=10, maxRadius=240)
        if circles is not None:  # 如果识别出圆
            for circle in circles[0]:
                #  获取圆的坐标与半径
                x = int(circle[0])
                y = int(circle[1])
                r = int(circle[2])
                cv2.circle(frame, (x, y), r, (0, 255, 0), 3)  # 标记圆
                cv2.circle(frame, (x, y), 6, (255, 255, 0), -1)  # 标记圆心
                text = 'x:  ' + str(x) + ' y:  ' + str(y)
                cv2.putText(frame, text, (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)  # 显示圆心位置
        else:
            # 如果识别不出,显示圆心不存在
            cv2.putText(frame, 'x: None y: None', (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)
        cv2.imshow('frame', frame)
        cv2.imshow('edges', edges)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('cap is not opened!')

二、函数解析

1.cv2.HoughCircles函数

circles = cv2.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0)

1.image:输入图像(灰度图)/输入摄像头设备

2.method:使用霍夫变换圆检测的算法,参数为cv2.HOUGH_GRADIENT

3.dp:霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推(显示圆关键)

4.minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心(值小会检测到多个圆,值过大无法检测到圆)

5.param1:边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半

6.param2∶检测圆心和确定半径时所共有的阈值(实际上是显示假圆的数目,值越高,显示出假圆数目越少;param2是检测阶段圆心的累加器阈值。它越小,可能检测到的假圆越多(因为满足累加器上限的条件变多了)。与累加器最大数值结果代表的圆将被首先返回。)

7.minRadius和maxRadius:为所检测到的圆半径的最小值和最大值

circles:输出圆向量,包括三个浮点型的元素――圆心横坐标,圆心纵坐标和圆半径。赋值时按默认顺序赋值即可,注意数据类型

2.双边滤波:bilateralFilter() 函数

bilateralFilter ( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT )

1.src:输入图像

2.d:过滤时周围每个像素领域的直径

3.sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。

4.sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。

3.形态学操作-开运算

opening= cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 

Opencv-霍夫圆检测-代码解析

Opencv-霍夫圆检测-代码解析

 4.cv2.circle()-画圆

它有五个参数:

  1. img:要划的线所在的图像;
  2. pt1:圆心坐标
  3. pt2:半径  ( 
  4.  color:颜色
  5. thickness=1:线条粗细,默认是1.如果一个闭合图形设置为-1,那么整个图形就会被填充可以改变数值

如果画圆心  cv2.circle(frame, (x, y), 6, (255, 255, 0), -1)  # 标记圆心

5.cv2.putText函数

cv2.putText(image, text, (5,50 ), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)

  • 图片
  • 要添加的文字
  • 文字添加到图片上的位置
  • 字体的类型
  • 字体大小
  • 字体颜色
  • 字体粗细

6.opencv的RGB 颜色表

RGB(255,23,140)是光的三原色,也即是红绿蓝Red,Green,Blue,它们的最大值是255,相当于100%。

白色:rgb(255,255,255)

黑色:rgb(0,0,0)

红色:rgb(255,0,0)

绿色:rgb(0,255,0)

蓝色:rgb(0,0,255)

青色:rgb(0,255,255)

紫色:rgb(255,0,255)

Opencv-霍夫圆检测-代码解析


7.cv2.imshow和cv2.waitKey函数

cv2.imshow()函数需要两个输入,一个是图像窗口的名字即title,一个是所展示图片的像素值矩阵。

 

waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。

8.霍夫圆思路

本次程序引用cv2和numpy。使用cv2.videocapture开启摄像头,默认摄像头数据为0,若有多个摄像头依次添加即可。可进行摄像头参数设置,使用cap.set,同时利用它设置帧宽和帧高。摄像头是否开启的检测使用使用cap.isOpened() is True,true代表框是否闭合,如不闭合,使用false。同时对图片换名,转换为灰色通道和hsv空间,开启形态学开运算,实际上包括膨胀和腐蚀,也是去除杂质一种方法。接下来进行消噪,采用双边滤波方法,使用bilateralFilter() 函数接下来进行边缘识别,采用cv2.Canny函数。最重要的我们将识别圆,采用cv2.HoughCircles函数,circles = cv2.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0),同时它的返回值为包括三个浮点型的元素――圆心横坐标,圆心纵坐标和圆半径。(赋值时按默认顺序赋值即可,注意数据类型)最后检测一下是否识别到圆:if circles is not None。X,y,r值赋值、标识圆和圆心:cv2.circle(frame, (x, y), 6, (255, 255, 0), -1),-1其实代表一种检测,如果图形为闭合,那么图形将被填充。在窗口上打印出圆心的坐标,如果没有识别圆心,输出没有。

Cv2.imshou显示出两个窗口,一个灰度,一个正常。同时采用cv2.waitkey函数。k = cv2.waitKey(5) & 0xFF写法默认吧。

总结

希望这些能够帮到你,但是不要盲目的复制哦文章来源地址https://www.toymoban.com/news/detail-464575.html

到了这里,关于Opencv-霍夫圆检测-代码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 霍夫变换直线检测算法实现OpenCV(C++)

    一、原理 对于霍夫变换的原理这里就不进行描述啦,感兴趣的可以自行搜索。也可以看知乎上面的这篇贴文通俗易懂理解——霍夫变换原理。 二、算法代码 三、效果测试 测试代码 上述代码中的drawLine()函数是《OpenCV4快速入门》一书的代码清单 7-2中的原函数,只用于画线。

    2024年02月05日
    浏览(34)
  • 【OpenCV】cv2.HoughLines()霍夫直线检测

    霍夫直线检测(Hough Line Transform)是一种在图像中检测直线的经典算法。它通过将二维图像空间中的点映射到极坐标空间中,将直线检测问题转化为在参数空间中找到交点的问题。 原理: 对于图像空间中的每个边缘点,计算其对应在极坐标空间中可能的直线。 极坐标空间中

    2024年02月05日
    浏览(43)
  • OpenCV26HoughCircles 霍夫圆变换原理及圆检测

    霍夫圆变换的基本原理与霍夫线变换大体类似 对直线来说,一条直线能由极径极角(r,θ)表示,而对于圆来说,我们需要三个参数:圆心(a,b),半径 r 笛卡尔坐标系中圆的方程为: (x-a)2 + (y-b)2 = r2 化简便可得到: a = x - r·cosθ b = y - r·sinθ 对于(x0,y0),我们可以将通

    2024年02月03日
    浏览(30)
  • opencv 十一 霍夫圆检测原理及高级使用案例(含优化步骤)

    霍夫圆检测能检测出目标图像中存在的圆,但在实际使用中,参数调节存在很大的困难,故在本博文中对霍夫圆检测的原理、参数列表、优化经验进行分析总结。详细的列出了各个参数的调节依据,实现了在复杂背景下的霍夫圆检测。 相关知识: 霍夫圆检测与霍夫变换密切

    2024年02月04日
    浏览(39)
  • OPENCV C++(七)霍夫线检测+找出轮廓和外接矩形+改进旋转

    霍夫线检测  定义存放输出线的向量 此向量输出有距离,角度 因为检测的原理就是在变换霍夫空间里面去检测的,这里可以理解为极坐标 第3个参数是距离精度 第四个参数是角度精度,第五个是阈值,只有点超过90个才算一条线 在图中画线操作: 这里是画线操作  概率霍夫

    2024年02月13日
    浏览(31)
  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(39)
  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(50)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(35)
  • 霍夫变换直线检测原理和应用

    今天我们将重点讨论霍夫变换,这是一种非常经典的线检测的算法,通过将图像中的点映射到参数空间中的线来实现。霍夫变换可以检测任何方向的线,并且可以在具有大量噪声的图像中很好地工作。 闲话少说,我们直接开始吧! 为了理解霍夫变换的工作原理,首先我们需

    2024年02月06日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包