如何从轮廓分割圆?

How to segment circle from contour?

目标:在 OpenCV 中定位球

问题:我有一个面具,我为我的球获得了 hsv 边界,但一些背景渗入了我的面具。我怎样才能从我不需要的背景中分割出我想要的圆圈? 我怀疑问题是我正在使用 minEnclosingCircle,但我不知道还能使用什么

我试过腐蚀我的面具来分开圆圈,但它对我没有太大好处

遮罩

结果圆


def draw_circle(orig,mask,name):
    cnts=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts=imutils.grab_contours(cnts)
    center=None
    if len(cnts)>0:
        c=max(cnts,key=cv2.contourArea)
        ((x,y),radius)=cv2.minEnclosingCircle(c)
        M=cv2.moments(c)
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
        if radius > 10:
            cv2.circle(orig, (int(x), int(y)), int(radius),
                (0, 255, 255), 2)
            cv2.circle(orig, center, 5, (0, 0, 255), -1)
        #d=int(name.split(".JPG")[0])
        #expected_R=(231*1.6)/(2*d)
        #error=1.0-(radius/expected_R)
        #print "error is "+str(error)

    else:
        print "oops"
    cv2.imshow(str(name)+" circled",orig)
    cv2.imshow(str(name)+" mask",mask)
    cv2.waitKey(0)

首先,我建议您尝试使用边缘检测算法,一个简单的 Sobel 过滤器 应该足以为您提供球的不同特征,然后执行阈值处理消除噪音。您可以像现在一样使用 拟合椭圆 最小外接圆 来更好地定位球。 this

中有更多详细信息

另一种方法是圆的霍夫变换,这是一种为检测圆而定制的算法,但与之前提出的方法相比,它的计算成本更高。请参阅以下 link

请注意,如果您图像中呈现的场景只是一个模型,而不是依赖项或真实用例,我建议您使用不同颜色的背景,这就是您的工作容易多了。