<python,opencv =“”>我如何使用cv2.ellipse?</python,>

时间:2013-09-03 14:40:00

标签: python opencv

用于python的OpenCV2有2个功能


[功能1]

  • Python:cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color [,thickness [,lineType [,shift]]])→无

[功能2]

  • Python:cv2.ellipse(img,box,color [,thickness [,lineType]])→无

我想使用[功能1]

但是当我使用此代码时

  

cv2.ellipse(ResultImage,Circle,Size,Angle,0,360,Color,2,cv2.CV_AA,0)

提出

  

TypeError:ellipse()最多需要5个参数(给定10个)


你能帮帮我吗?

5 个答案:

答案 0 :(得分:9)

默认情况下,Python doesn't support multiple dispatch在这里没有帮助:具有两个具有相同名称但不同参数的函数不是pythonic。所以问题是:cv2如何猜测我们想要调用的版本?我找不到任何明确的文档。

无论如何,在遇到与opencv 3.0.0-beta和Python 3.4.2相同的问题后,我终于发现在我的情况下,圆圈的一个点是float,虽然我在运行官方样本代码有8个参数,由于某种原因cv2默认为5-args函数。使用int修复了问题,因此错误消息非常具有误导性。

我认为从Python 2到3可能会在现有代码中引起这种混乱,因为Python 3中的integer divisions return floats

答案 1 :(得分:4)

确保所有椭圆参数都是 int ,否则它会引发“TypeError:ellipse()最多需要5个参数(给定10个)”。有同样的问题并将参数转换为int,修复它。

请注意,在Python中,您应首先对数字进行舍入,然后使用int(),因为int函数将减少数字:

x = 2.7,int(x)将是2 而不是3

答案 2 :(得分:1)

我遇到了同样的错误,结果发现我没有将正确的最小参数数量(7)传递给方法的startAngle / endAngle形式。在我的情况下,我错过了“angle”参数(椭圆的旋转角度),它在startAngle和endAngle参数之前。

我的猜测是你的“圆圈”或“大小”参数错了......它们应该是元组, (x,y)表示中心和(轴宽度,高度)

cv2.ellipse(ResultImage, (centerX,centerY), (width,height), 0, 0, 180, yellow, 2)

答案 3 :(得分:0)

这些参数应该是整数,否则会引发TypeError

答案 4 :(得分:0)

其他答案正确地指出,调用[Function 1]版本需要在某些参数中使用int坐标(具体而言)centeraxes。但是,他们没有提到您可以使用shift参数在子整数分辨率的坐标中保持“小数位”精度。

这是cv2.ellipse的一个示例包装函数,它可以接受float坐标并在重写它们之后将它们转换为int s,以便与shift参数一起使用:

def draw_ellipse(
        img, center, axes, angle,
        startAngle, endAngle, color,
        thickness=3, lineType=cv2.LINE_AA, shift=10):
    center = (
        int(round(center[0] * 2**shift)),
        int(round(center[1] * 2**shift))
    )
    axes = (
        int(round(axes[0] * 2**shift)),
        int(round(axes[1] * 2**shift))
    )
    cv2.ellipse(
        img, center, axes, angle,
        startAngle, endAngle, color,
        thickness, lineType, shift)

shift参数表示centeraxes坐标值中“小数位”的数量,这就是为什么坐标乘以2的幂(乘以2是就像把它们的整数二进制表示中的位向左移一个一样。)这个shift技巧也可以用于许多其他的opencv函数,但它的用法没有很好地记录(特别是在python中)。