Подтвердить что ты не робот

Функции поливинов Openc в исключении python throws

Я пытаюсь нарисовать произвольный четырехугольник над изображением, используя функцию полилиний в opencv. Когда я это сделаю, я получаю следующую ошибку:

Ошибка OpenCV: утверждение не выполнено (p.checkVector(2, CV_32S) >= 0) в полилинии, файл /tmp/buildd/ros -fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp, строка 2065

Я вызываю функцию так же,

cv2.polylines(img, points, 1, (255,255,255))

Где точки - это числовая матрица, как показано ниже (размер изображения 1280x960):

[[910 641]
 [206 632]
 [696 488]
 [458 485]]

и img - просто нормальный образ, который я могу импровизировать. В настоящее время я просто рисую линии между этими точками самостоятельно, но я ищу более элегантное решение.

Как исправить эту ошибку?

4b9b3361

Ответ 1

В моем случае проблема заключалась в том, что numpy.array создал int64 -битные номера по умолчанию. Поэтому я должен был явно преобразовать его в int32:

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(Похож на ошибку в cv2 python binding, он должен был проверить dtype)

Ответ 2

Эта функция недостаточно документирована, и ошибка также не очень полезна. В любом случае cv2.polylines ожидает список точек, просто измените свою строку на это:

import cv2
import numpy as np

img = np.zeros((768, 1024, 3), dtype='uint8')

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
cv2.polylines(img, [points], 1, (255,255,255))

winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey()
cv2.destroyWindow(winname)

В приведенном выше примере будет напечатано следующее изображение (перемасштабировано):

enter image description here

Ответ 3

ошибка говорит о том, что ваш массив должен иметь размерность 2. Так измените массив следующим образом:

points = points.reshape(-1,1,2)

Тогда он отлично работает.

Кроме того, ответ, предоставленный jabaldonedo, также отлично подходит для меня.

Ответ 4

pts = np.array([[40,300],[54,378],[60,420],[30,333]],np.int32) 
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,pts,True,(125,215,145),1)

Официальная документация для предоставления объяснений, необходимо изменить форму

Ответ 5

Замените cv2.fillPoly( im, np.int32(points)) на cv2.fillPoly( im, np.int32([points])). Это будет работать.