14

用于 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 个)


你可以帮帮我吗?

4

5 回答 5

11

Python 默认不支持多分派这一事实在这里没有帮助:拥有两个同名但参数不同的函数不是 Pythonic。所以问题是:如何cv2猜测我们想要调用的版本?我找不到任何明确的文档。

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

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

于 2014-11-29T12:11:40.077 回答
7

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

请注意,在 Python 中,您应该先将数字四舍五入,然后再使用 int(),因为 int 函数会削减数字:

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

于 2015-02-18T19:55:07.540 回答
2

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

我的猜测是你的“Circle”或“Size”参数是错误的......它们应该是元组,(x,y)代表中心,(宽度,高度)代表轴

cv2.ellipse(ResultImage, (centerX,centerY), (width,height), 0, 0, 180, yellow, 2)
于 2013-10-08T22:35:14.470 回答
2

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

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

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中的“小数位”的数量,这就是为什么坐标乘以 2 的幂(乘以 2 与将整数二进制表示中的位左移一位相同。)这技巧对于许多其他 opencv 函数也很方便,但是它的用法没有很好地记录(尤其是在 python 中)。centeraxesshift

于 2017-07-03T18:56:39.397 回答
0

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

于 2013-12-26T06:36:42.120 回答