如何从轮廓分割圆?

时间:2019-05-09 09:08:11

标签: python opencv mask contour

目标:在OpenCV中找到球

问题:我有一个用hsv边界获得的口罩,但是我的口罩有些渗入背景。如何从不需要的背景中分割出想要的圆? 我怀疑问题是我正在使用minEnclosingCircle,但我不知道该用什么

我尝试腐蚀面具以分隔圆圈,但这对我没有多大帮助

面具

mask

结果圈子

resulting circle


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)

1 个答案:

答案 0 :(得分:1)

首先,我建议您尝试使用边缘检测算法,简单的 Sobel滤波器应该足以为您提供球的独特功能,然后执行阈值消除噪声。现在,您可以使用拟合椭圆最小封闭圆来更好地定位球。在this

中有更多详细信息

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

请注意,如果图像中显示的场景只是一个模型,而不是依赖关系或实际用例,我建议您使用其他背景色,这样您的工作会容易得多