Получение ошибки «требуется целое число (полученный тип кортежа)», рисование прямоугольника с использованием cv2 в Python - PullRequest
0 голосов
/ 31 января 2019

Я написал базовый код 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)

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Модуль cv2 работает с массивами в качестве изображений, а не с PIL Image экземплярами.

Поскольку и реализация cv2.rectangle, и тип Imageреализованы полностью в скомпилированном коде, трассировка не очень полезна для понимания того, что происходит не так.Изнутри собственный код cv2.rectangle() пытается получить доступ к объекту изображения, для которого требуется целое число, но вместо этого cv2.rectangle() передается в кортеже, поскольку он ожидал взаимодействия с пустым массивом.

Если все, что вам нужно, - это пустое изображение с однородным цветом RGB, создайте массив пустышек с формой (ширина, высота, 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)
0 голосов
/ 31 января 2019

Нашел решение.Спасибо @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')
...