< Python,openCV>

<Python, openCV> How I can use cv2.ellipse?

opencv2 for python有2个函数

[功能1]

  • python:cv2.椭圆(img,center,axes,angle,startangle,endangle,color[,thickness[,linetype[,shift]]])→无

[功能2]

  • python:cv2.椭圆(img,box,color[,thickness[,linetype]])→无

我想使用[功能1]

但是当我使用这个代码时

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

它升起

TypeError: ellipse() takes at most 5 arguments (10 given)

你能帮我吗?


默认情况下,python不支持多个分派的事实在这里没有帮助:拥有两个同名但参数不同的函数不是pythonic。所以问题是:cv2如何猜测我们要调用的版本?我找不到任何明确的医生。

总之,在经历了Opencv3.0.0-beta和python 3.4.2的相同问题之后,我终于发现在我的例子中,循环的一个点是float,尽管我运行的是带有8个参数的官方示例代码,但出于某种原因,cv2默认为5-args函数。使用int解决了这个问题,因此错误消息非常具有误导性。

我相信从python 2到3可能会在现有的代码中带来这种混乱,因为整型除法在python 3中返回浮点数。


确保所有椭圆参数均为int,否则将引发"typeError:Ellipse()最多接受5个参数(给定10个)"。有同样的问题,将参数强制转换为int,修复了它。

请注意,在python中,应该首先对数字进行四舍五入,然后使用int(),因为int函数将剪切该数字:

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


我遇到了同样的错误,结果发现我没有将正确的最小参数数(7)传递给方法的startangle/endangle形式。在我的例子中,我缺少了"角度"参数(椭圆的旋转角度),它位于startangle和endangle参数之前。

我猜你的"circle"或"size"参数是错误的…它们应该是元组,(x,y)表示中心,(宽度,高度)表示轴。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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等于将整数二进制表示中的位数左移1)的原因是如此。这种shift技巧对于许多其他ope很方便。NCV也有函数,但是它的用法没有很好的记录(尤其是在Python中)。


这些参数应为整数,否则将引发类型错误