头条号:人工智能研究所
微信号:启示AI科技
今天我们介绍一个opencv 函数cv2.HoughCircles(),此函数主要用于检测图像中的圆形,我们知道3点可以画一个圆,学习CAD的同学肯定知道,opencv使用霍夫梯度的方法进行圆的检测
首先对图像进行canny边缘检测,对边缘中的每一个非0点,通过Sobel算法计算局部梯度。那么计算得到的梯度方向,实际上就是圆切线的法线。三条法线即可确定一个圆心,同理在累加器中对圆心通过的法线进行累加,就得到了圆环的判定。
cv2.HoughCircles函数:
cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
1:image为输入图像,需要灰度图
2:method为检测方法:CV_HOUGH_GRADIENT
3:dp为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,
如dp=1,累加器和输入图像具有相同的分辨率
如果dp=2,累计器便有输入图像一半的分辨率
4:minDist表示两个圆之间圆心的最小距离
5:param1默认值100,它是method设置的检测方法的对应的参数,
当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,
它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
6:param2默认值100,它是method设置的检测方法的对应的参数,
当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,
它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,
而它越大的话,能通过检测的圆就更加接近完美的圆形了
7:minRadius默认值0,圆半径的最小值
8:maxRadius默认值0,圆半径的最大值
import numpy as np
import cv2
image = cv2.imread("123.jpg")
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100)
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
break
cv2.imshow("output", np.hstack([image, output]))
cv2.waitKey(0)
首先我们导入一张图片,这里需要主要一下要转到灰度空间
然后使用circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100)函数对图片中的圆形进行检测,这里小编只显示了一个圆形,直接使用break函数 ,跳出for循环,因为里面检测到了很多无用的圆形,这里需要大家去优化函数中的各个参数,以便达到自己图片检测的目的
待图片检测完成后,使用cv2.circle(output, (x, y), r, (0, 255, 0), 4)函数,把检测到的图片中的圆形画出来,以便显示
代码截图
当然,此函数都可以检测多了圆形,删除代码中的break,函数便会显示所有的圆形,再次运行代码,便可以看到检测到的多 个圆形
检测到的多个圆形
这在计算机视觉应用中特别广泛,特别是工业自动化过程中,计算机视觉尤其重要,当然若想得到更精确的视觉检测,自己也可以进行神经网络的搭建与训练
微信搜索小程序:AI人工智能工具,体验不一样的AI工具