OpenCV在应用numpy转换后抛出错误

OpenCV在应用numpy转换后抛出错误,numpy,cv2,Numpy,Cv2,我遇到了一个奇怪的错误。应用np.flip后,cv2.rectangle抛出错误。下面是一个最小的可重复示例: image = np.random.choice(255,(50,50,3)).astype(np.uint8) image_180 = np.flip(image.copy()) x1,y1,x2,y2 = 20,20,30,30 cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),1) cv2.rectangle(image_180,(x1,

我遇到了一个奇怪的错误。应用
np.flip
后,
cv2.rectangle
抛出错误。下面是一个最小的可重复示例:

image = np.random.choice(255,(50,50,3)).astype(np.uint8)
image_180 = np.flip(image.copy())
x1,y1,x2,y2 = 20,20,30,30
cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),1)
cv2.rectangle(image_180,(x1,y1),(x2,y2),(0,255,0),1)
image和image_180都属于
numpy.ndarray
类型,并且属于dtype
np.uint8
。但是,对rectangle的第二次调用引发以下错误:

TypeError: an integer is required (got type tuple)

这毫无意义。我假设这是一个bug或者是一个懒散的补丁。

事实上,这个错误消息非常混乱

根据官方NumPy文档,返回输入数组的视图。这可能会导致OpenCV出现问题

一个简单的修复方法是传递返回视图的深度副本,即:

r = cv2.rectangle(image_180.copy(), (x1, y1), (x2, y2), (0, 255, 0), 1)
奇怪的是,
cv2.rectangle()
有时会处理视图,例如:

r = cv2.rectangle(image[:10], (x1, y1), (x2, y2), (0, 255, 0), 1)
这对我来说意味着NumPy或OpenCV中存在某种缺陷。无论哪种方式,在阵列上使用
.copy()
都可以解决问题

image_180=np.flip(image.copy())

您的代码有点混乱(深度复制位置)

以下代码适用于我:

image_180 = np.flip(image).copy()

你说得对。我通过调用cv2.UMat(image_180).get()进行了权宜之计的修复,但这也有效地将深度复制作为过程的一部分。