霍夫圆变换是利用数学原理检测图像中的圆形的一种方法。它需要对每个像素点进行检测,计算出其是否可以代表一个圆。这种方法在处理较小的圆或噪声较小的图像时非常有效。
霍夫圆变换算法的具体步骤如下:
OpenCV 中可以通过调用 cv2.HoughCircles()
函数来实现霍夫圆变换算法的检测。这个函数有一些参数需要设置,如下所示:
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
参数说明:
下面是关于 OpenCV 霍夫圆变换的两个示例:
import cv2
import numpy as np
img = cv2.imread('test.jpg', 0)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
# draw the outer circle
cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码从文件中读取了图像,并将它转为了灰度图像,然后应用了中值滤波器以消除噪声。接下来,通过将图像传递给 cv2.HoughCircles()
函数,使用标准的 CV_HOUGH_GRADIENT 霍夫变换方法来检测图像中的圆形。最终,使用 cv2.circle()
函数将检测出的圆形绘制在彩色输出图像中。
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# Convert to gray
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Apply Gaussian Blur
gray_blur = cv2.GaussianBlur(gray, (25, 25), 0)
# Detect Circles
circles = cv2.HoughCircles(gray_blur, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# If circles are detected, convert the (x, y) coordinates and radius of the circles to integers
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
# Loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# Draw the circle in the output frame
cv2.circle(frame, (x, y), r, (0, 255, 0), 2)
# Display the resulting frame
cv2.imshow('Circle Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
以上代码从摄像机捕获了连续的帧。在每个帧上,从 BGR 色彩空间转换为灰度图像,并应用了高斯模糊器以消除噪声。接下来,应用霍夫圆变换检测图像中的圆。最终,使用 cv2.circle()
函数将检测出的圆形绘制在上述的帧上。
使用 OpenCV 的霍夫圆变换功能可以非常轻松地检测图像中的圆形。此外,OpenCV 可以与摄像机一起使用,实时地捕获并处理每一帧。巧妙使用本方法,可以实现很多实时的图像识别应用。