OpenCV - 检测圆形形状

时间:2017-01-10 05:29:07

标签: python opencv image-processing geometry

我有一些检测圆形的代码,但我无法理解它是如何工作的。

从这段代码:

  1. 如何找到圆的半径和中心点?
  2. `cv2.approxPolyDP'是什么行为?用于检测圆圈?
  3. 现在在分段蒙版中找到轮廓

    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, ", ",
    

2 个答案:

答案 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以获得更好的理解。

希望这有帮助!! :)