用于python的OpenCV2有2个功能
我想使用[功能1]
但是当我使用此代码时
cv2.ellipse(ResultImage,Circle,Size,Angle,0,360,Color,2,cv2.CV_AA,0)
提出
TypeError:ellipse()最多需要5个参数(给定10个)
你能帮帮我吗?
答案 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
坐标(具体而言)center
和axes
。但是,他们没有提到您可以使用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
参数表示center
和axes
坐标值中“小数位”的数量,这就是为什么坐标乘以2的幂(乘以2是就像把它们的整数二进制表示中的位向左移一个一样。)这个shift
技巧也可以用于许多其他的opencv函数,但它的用法没有很好地记录(特别是在python中)。