使用带有不同参数的cv2.ellipse时出现椭圆拟合异常?

Unc*_*Meh 4 python opencv image-processing python-2.7

我在Windows 8.1上使用带有Python 2.7.9的OpenCV 2.4.11。我试图将椭圆形适合我的轮廓,但遇到了一些我无法弄清的东西。

当我调用cv2.fitEllipse并获取返回值,然后使用以下代码将返回值直接传递到cv2.ellipse时,绘制到屏幕上的椭圆是完美的,并且使我的轮廓达到最佳拟合:

contours, hierarchy = cv2.findContours(binaryimage,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

for ind, cont in enumerate(contours):
    elps = cv2.fitEllipse(cont)
    #Feed elps directly into cv2.ellipse
    cv2.ellipse(displayframe,elps,(0,0,255))

cv2.imshow("Perfectly fitted ellipses", displayframe)
Run Code Online (Sandbox Code Playgroud)

以上结果是

在此处输入图片说明

但是,当我尝试解析实际的椭圆参数并通过传入这些参数来手动绘制椭圆时(请参见下面的代码),它会创建椭圆的“膨胀”版本,从而给自己一个非常舒适(但很烦人)的空间围绕轮廓,如下所示:

contours, hierarchy = cv2.findContours(binaryimage,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

for ind, cont in enumerate(contours):
    (x,y),(MA,ma),angle = cv2.fitEllipse(cont)
    #feed the parsed parameters into cv2.ellipse
    cv2.ellipse(displayframe,(x,y),(MA, ma),angle,0,360,(0,0,255))

cv2.imshow("Ellipses NOT fitting the contours properly",displayframe)
Run Code Online (Sandbox Code Playgroud)

这种令人讨厌的现象的结果是:

在此处输入图片说明

是的,我知道使用第一种方法可以解决绘制正确的椭圆的问题。但是我想知道为什么要这样做,因为实际上,我将需要椭圆的参数来进行一些斑点跟踪,并且解析后的参数最终会给出像这样的宽幅不适合的椭圆,是真的吗准确?cv2.ellipse()绘图函数是否有问题?对出什么问题有任何想法吗?来自cv2.fitEllipse函数的椭圆参数是否正确?

Mik*_*iki 5

您正在绘制返回的边界框的宽度和高度。您应绘制一半的宽度和高度,因为椭圆的轴将是其边界框的一半的宽度和高度

cv2.ellipse(displayframe,(x,y),(MA/2, ma/2),angle,0,360,(0,0,255))
Run Code Online (Sandbox Code Playgroud)