我正在尝试使用houghcircles()检测这个裁剪图像中的小圆圈。我试图更改它的参数,但当我将param2增加到50以上时,它会出错;当maxaradius的值小于100时,它也会出错。现在它运行,但性能很差 这是原始图像:
这是我的代码:
from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2
im = cv2.imread('crop.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray, 200, 255,cv2.THRESH_BINARY)
cimg = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)
c = cv2.HoughCircles(thresh, cv2.HOUGH_GRADIENT, 0.5, 41, param1=70,
param2=30, minRadius=10,maxRadius=175)
c = np.uint16(np.around(c))
for i in c[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.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 800,800)
cv2.imshow('img',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
请问,我该如何更改参数?
在OpenCV 3中,findContours的签名已更改。 要返回轮廓,需要更改此线:
为了这个
如果你试图改变参数而不了解它们的作用,那么你需要很长时间来解决这个问题。
此说明来自here
你可以清楚地看到你的图像中的圆有固定的半径,并且有最小的间隔。如果你设置这两个,你可以提高你的结果。所以读这些文件很重要。
关于你的问题,如果你有特别的必要使用Houghcirles,请继续微调它。可以做的改进是,使用gaussianblur进行预处理,使用adaptivethreshold而不仅仅是threshold。
如果没有必要使用Hough圆,我建议您使用轮廓代替。因为它更健壮,对不同的图像有很好的泛化能力。这是我用等高线得到的结果。圆圈看起来更小,因为我已经使用侵蚀6次迭代和膨胀仅3次迭代。
这是我使用的代码。
希望这有帮助:)
相关问题 更多 >
编程相关推荐