OpenCV 在应用 numpy 转换后抛出错误
OpenCV throws errors after applying numpy transformations
我 运行 遇到了一个奇怪的错误。应用 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)
这毫无意义。我假设这是一个错误或带有惰性修复的东西。
确实,这个错误信息很混乱。
根据 NumPy 官方文档,np.flip()
returns输入数组的视图。据推测,这会导致 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()
我 运行 遇到了一个奇怪的错误。应用 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)
这毫无意义。我假设这是一个错误或带有惰性修复的东西。
确实,这个错误信息很混乱。
根据 NumPy 官方文档,np.flip()
returns输入数组的视图。据推测,这会导致 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()