教你用OpenCV 和 Python实现圆物检测

点击上方码农的后花园”,选择星标” 公众号

精选文章,第一时间送达

基于python使用OpenCV实现在一张图片中检测出圆形,并且根据圆检测结果信息,绘制 标记出圆的边界和圆心。

1 HoughCircles 霍夫圆检测函数

在Opencv中使用HoughCircles函数可以实现圆的检测,具体函数参数如下:

  • image: 输入图像,8位灰度单通道图像

  • method: 检测圆的方法,目前OpenCV中有HOUGH_GRADIENTHOUGH_GRADIENT_ALT两种方法。

  • dp: 检测圆心的累加器图像的分辨率与输入图像之比的倒数,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器输入图像便有输入图像一半那么大的宽度和高度。减少图像的分辨率(宽高变小)是为了减少计算量,一般默认为1就好,保持原有图像精度。

  • minDist: 检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。

  • circles: 检测到的圆的信息输出向量(x,y,r),分别代表检测到圆的中心坐标和圆半径。

  • param1: Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。也就是说检测图像中像素点的值大于param1是会检测为边缘。

  • param2: 表示在检测阶段圆心的累加器阈值。它越小的话,会误检测到更多根本不存在的小圆,而越大,能通过检测的圆就更加接近完美的圆形了。

  • minRadius: 表示图像中能检测到最小圆的半径的值。

  • maxRadius: 表示图像中检测到的圆的最大半径的值。

参数设置总结

  • param2值的设置根据要检测图像中圆的大小进行设置,minRadius最小圆半径和maxRadius最大圆半径可以辅助我们更好选择圆,如果没有特殊需要就都默认为0。minDist可以帮助我们筛选掉检测相近的圆。

  • 霍夫圆检测的原理:第一步通过Canny边缘检测算法检测边缘,发现可能的圆心,然后再计算边缘像素点到圆心的距离估计圆的半径。

2 HoughCircles 霍夫圆检测代码实现

实现霍夫圆检测的实现代码非常简单,首先使用cv2.cvtColor函数将要检测的图像转换为灰度图像,然后调用cv2.HoughCircles霍夫圆检测函数进行检测,检测返回所有圆的中心坐标和半径信息向量circles(x,y,r)

注意: 霍夫圆检测对噪声比较敏感,所以进行霍夫圆检测的之前可以先进行中值滤波cv2.medianBlur

def circle_detect(image):
    # 灰度化
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 输出图像大小,方便根据图像大小调节minRadius和maxRadius
    print(image.shape)
    # 进行中值滤波
    img = cv2.medianBlur(gray, 5)

    # 霍夫变换圆检测
    circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=5, maxRadius=100)
    for circle in circles[0]:
        # 圆的基本信息
        print(circle[2])
        # 坐标行列-圆心坐标
        x = int(circle[0])
        y = int(circle[1])
        # 半径
        r = int(circle[2])
        # 在原图用指定颜色标记出圆的边界
        cv2.circle(image, (x, y), r, (0, 0, 255), 3)
        # 画出圆的圆心
        cv2.circle(image, (x, y),5, (0, 255, 0), -1)

    cv2.imshow("image",image)

img = cv2.imread(r'D:\yolov5-5.0\data\images\1.jpg')
circle_detect(image=img)

cv2.waitKey(0)

最后再借助OpenCV中的画圆函数cv2.circle,cv2.circle函数参数具体如下:

  • img: 要在其上绘制圆的输入图像

  • center: 绘制圆的中心坐标(x,y),未设置shift参数时,默认为整数int类型。

  • radius: 绘制圆的半径,未设置shift参数时,默认为整数int类型

  • color: 绘制圆的边界线的颜色,OpenCV读取图像后,图像格式为BGR,即【0,255,255】表示用红色绘制圆的边缘。

  • thickness: 圆的边界线的粗细像素值。值为负(-1)时绘制实心圆。

  • lineType: 可选参数,线的类型:虚线、实线

  • shift: 可选参数,圆心坐标点和半径值的小数点位数。

3 检测效果

通过合理的控制minDistminRadiusmaxRadiusparam2这四个参数的值,最终的检测效果如下图:

公众号:码农的后花园,后台回复:项目实战,即可获取代码下载使用。

往期精彩教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底) &&    教你用OpenCV和Python实现手掌检测和手掌计数

                                                 分享给更多朋友,转发,点赞,在看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值