我有一些检测圆形的代码,但我无法理解它是如何工作的。
从这段代码:
现在在分段蒙版中找到轮廓
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
对轮廓进行排序w.r.t contour rect X
contours.sort(key = lambda x:cv2.boundingRect(x)[0])
for contour in contours:
approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True)
if len(approx) > 8:
# Find the bounding rect of contour.
contour_bounding_rect = cv2.boundingRect(contour)
mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2
print mid_point[1]/single_element_height, ", ",
答案 0 :(得分:3)
不要认为aboutPolyDP是正确的方式。
如果您的图像中只有圆圈而您想查找中心和半径,请尝试使用minEnclosingCircle()
如果你有一个图像,你有各种形状,你想找到圆圈,尝试Hough变换(可能需要很长时间)或fitEllipse(),你检查它返回的边界框是否是方形。
请参阅这两个功能的文档
答案 1 :(得分:1)
所以我找到了第一个问题的答案:确定图像中圆圈的中心和半径。
最初我发现图像中存在所有轮廓。然后使用for loop
,我使用cv2.minEnclosingCircle
为图像中的每个轮廓找到中心和半径。我把它们打印在控制台屏幕上。
contours,hierarchy = cv2.findContours(thresh,2,1)
print len(contours)
cnt = contours
for i in range (len(cnt)):
(x,y),radius = cv2.minEnclosingCircle(cnt[i])
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)
print 'Circle' + str(i) + ': Center =' + str(center) + 'Radius =' + str(radius)
在cv2.approxPolyDP()
上回答你的第二个问题;此函数基于名为“ε”的参数在图像中围绕对象绘制近似轮廓。 ε&#的值越高,轮廓大致近似。对于较低的epsilon
值,轮廓几乎擦除图像中对象的每个边缘。请访问THIS PAGE以获得更好的理解。
希望这有帮助!! :)