OpenCV 的绘制矩形 (cv2.rectangle) 中颜色参数的 python 绑定发生了什么变化?



这曾经有效:

cv2.rectangle(image, (top,left), (bottom,right), color=color_tuple, thickness=2)

其中图像是 np.uint8 值的 nxmx3 数组,color_tuple由 np.uint8 值的 3 元组组成,例如 (2,56,135)。 现在它产生了在我自己的代码(不是 Numpy 或 OpenCV 代码)中引发的此错误:

Exception has occurred: TypeError
Argument given by name ('color') and position (3)

从参数中删除名称:

cv2.rectangle(image, (top,left), (bottom,right), color_tuple, 2)

产生此错误:

TypeError: function takes exactly 4 arguments (2 given)

我相信这两个错误都与 openCV 源代码中被覆盖的矩形函数有关,在该函数中,它查找图像后跟一对元组。 如果找不到它,它会尝试使用接受图像和矩形元组的重写函数。 所以回溯不能代表错误,但我无法弄清楚为什么不再接受 numpy 类型。 我尝试了np.int16,int(将其转换为np.int64)。 我只能通过使用 tolist() 函数将数组转换为 python 原生整数来让它运行。

color_tuple = tuple(np.array(np.random.random(size=3)*255, dtype=np.int).tolist())

这是什么原因造成的? OpenCV中是否有其他地方的numpy数据类型不起作用?

Python: 3.6.9
OpenCV: 4.5.1
Numpy: 1.19.5
IDE: VSCode

根据这篇文章,使用tolist()可能是正确的解决方案。

问题是color_tuple元素的类型是<class 'numpy.int32'>.
cv2.rectangle期望原生python 类型 - 具有int类型元素的元组。

下面是重现错误的代码示例:

import numpy as np
import cv2
image = np.zeros((300, 300, 3), np.uint8)  # Create mat with type uint8 
top, left, bottom, right = 10, 10, 100, 100
color_tuple = tuple(np.array(np.random.random(size=3)*255, dtype=np.int))
print(type(color_tuple[0]))  # <class 'numpy.int32'>
cv2.rectangle(image, (top, left), (bottom, right), color=color_tuple, thickness=2)

上面的代码打印<class 'numpy.int32'>并引发异常:

由名称("颜色")和位置给出的参数 (3)

.tolist()相同的代码:

color_tuple = tuple(np.array(np.random.random(size=3)*255, dtype=np.int).tolist())
print(type(color_tuple[0]))

上面的代码打印<class 'int'>没有例外。


显然.tolist()将类型转换为本机int(NumPy 数组类实现方法.tolist()这样做)。

  • l = list(np.array((1, 2, 3), np.int))返回numpy.int32元素的列表。
  • l = np.array((1, 2, 3), np.int).tolist()返回int元素的列表。

此处描述了listtolist()的区别。

相关内容

  • 没有找到相关文章

最新更新