首页 > 解决方案 > 获取“需要整数(获取类型元组)”错误,使用 cv2 绘制矩形

问题描述

我编写了一个基本的 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)

有人可以帮忙吗?

标签: pythonimageopencv

解决方案


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

因为cv2.rectangle实现和Image类型都是完全在编译后的代码中实现的,所以回溯对于理解问题所在并没有那么大的帮助。在底层,本机cv2.rectangle()代码尝试访问图像对象上需要整数但cv2.rectangle()传入元组的内容,因为它期望与 numpy 数组交互。

如果您想要的只是一个具有统一 RGB 颜色的空白图像,请创建一个形状为 (width, height, 3) 的 numpy 数组,并将您的 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)

推荐阅读