例子源于OpenCV官网手册(https://opencv.org/)
使用OpenCV函数HoughCircles()来检测图像中的圆。
代码的功能:
加载一个图像和模糊它减少噪声
应用霍夫圆变换模糊图像。
在窗口中显示检测到的圆圈。
代码:
import sys
import cv2 as cv
import numpy as np
def main(argv):
#加载图像
default_file = 'round.png'
filename = argv[0] if len(argv) > 0 else default_file
# Loads an image
src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)
# Check if image is loaded fine
if src is None:
print ('Error opening image!')
print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
return -1
#转灰度图像
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
#应用中值模糊来减少噪声和避免错误的圆检测:
gray = cv.medianBlur(gray, 5)
#继续应用霍夫圆变换:
rows = gray.shape[0]
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 8,
param1=100, param2=30,
minRadius=1, maxRadius=30)
# circles = cv.HoughCircles(gray,cv.HOUGH_GRADIENT,dp=1,minDist=50,
# param1=50,param2=30
# ,minRadius=0,maxRadius=0)
"""
参数:
gray:输入图像(灰度)。
circles:一个存储3个值的矢量:xc,yc,r,用于每个被检测到的圆。
定义检测方法。目前这是OpenCV中唯一可用的。
dp = 1:分辨率的反比。
min_dist =灰色。rows/16:检测中心之间的最小距离。
param_1 = 200:内部Canny边缘检测器的上门限。
param_2 = 100*:中心检测阈值。
min_radius = 0:最小检测半径。如果未知,将0作为默认值。
max_radius = 0:最大检测半径。如果未知,将0作为默认值。
"""
#绘制检测到的圆圈:
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
center = (i[0], i[1])
# circle center
#cv.circle(src, center, 1, (0, 100, 100), 3)
cv.circle(src, center, 1, (0, 255, 0), 3)
# circle outline
radius = i[2]
cv.circle(src, center, radius, (255, 0, 255), 3)
#显示检测到的圆圈,等待用户退出程序:
cv.imshow("detected circles", src)
cv.waitKey(0)
return 0
if __name__ == "__main__":
main(sys.argv[1:])
运行结果:
原图:
检测到的圆: