Python 得到一个;整数是必需的(Get类型元组)";错误,使用cv2绘制矩形

Python 得到一个;整数是必需的(Get类型元组)";错误,使用cv2绘制矩形,python,image,opencv,Python,Image,Opencv,我已经编写了一个基本的Python代码来创建一个图像,然后在边界上放置一个矩形。这似乎不起作用。我检查了多个网站,这是他们使用的确切代码。不知道是什么问题 import cv2 import numpy as np img = Image.new('RGB', (800, 900), color= (171, 183, 255)) cv2.rectangle(img,(1,1),(800,900),(255,0,0),15) img 我得到了这个错误 TypeError <ipython

我已经编写了一个基本的Python代码来创建一个图像,然后在边界上放置一个矩形。这似乎不起作用。我检查了多个网站,这是他们使用的确切代码。不知道是什么问题

import cv2
import numpy as np
img = Image.new('RGB', (800, 900), color= (171, 183, 255))
cv2.rectangle(img,(1,1),(800,900),(255,0,0),15)
img
我得到了这个错误

TypeError
<ipython-input-251-4b78f75077e8> in <module>()
      4 img = Image.new('RGB', (800, 900), color= (171, 183, 255))
      5 # cv2.rectangle(img, 0, 0, 800, 900, (255,0,0))
----> 6 cv2.rectangle(img,(1,1),(800,900),(255,0,0),15)
      7 img

TypeError: an integer is required (got type tuple)
TypeError
在()
4 img=Image.new('RGB',(800900),color=(171183255))
5#cv2.矩形(img,0,0,800900,(255,0,0))
---->6CV2.矩形(img,(1,1),(800900),(255,0,0),15)
7 img
TypeError:需要整数(获取类型元组)

有人能帮忙吗?

找到了解决方案。谢谢@Martijn Pieters

import cv2
import numpy as np
from PIL import Image

img = Image.new('RGB', (800, 900), color= (171, 183, 255))
open_cv_image = np.array(img) 

cv2.rectangle(open_cv_image,(0,0),(800,900),(0,0,0),30)
img2 = Image.fromarray(open_cv_image, 'RGB')

cv2
模块将numpy数组作为图像使用,而不是使用
PIL
Image
实例

因为
cv2.rectangle
实现和
Image
类型都是完全在编译代码中实现的,所以回溯对于理解出错的原因并没有多大帮助。在引擎盖下,本机
cv2.rectangle()
code试图访问image对象上需要整数的某些内容,但是
cv2.rectangle()
在元组中传递,因为它希望与numpy数组交互

如果您想要的只是一张RGB颜色一致的空白图像,请创建一个numpy阵列,将形状(宽度、高度、3)和3个色带设置为首选RGB值:

import numpy as np

# numpy equivalent of Image.new('RGB', (800, 900), color=(171, 183, 255))
img = np.zeros((800, 900, 3), np.uint8)
img[..., :] = (171, 183, 255)
然后对该数组应用
cv2.rectangle()
调用

您始终可以使用以下各项从和转换为PIL图像:

# create numpy array from PIL image
nparray = np.array(img)
# create PIL image from numpy array
img = Image.fromarray(nparray)

在某些情况下,OpenCV需要使用UMat类包装图像

img = Image.new('RGB', (800, 900), color= (171, 183, 255))
open_cv_image = np.array(img) 
image = cv2.UMat(open_cv_image).get()
cv2.rectangle(open_cv_image,(0,0),(800,900),(0,0,0),30)

另外,图像是什么类型的对象?是来自PIL/Pizz的
图像
模块,例如来自PIL导入图像的
?是的,图像模块来自Pizz。然后,OpenCV似乎不能直接处理PIL图像。