Функция полилиний Opencv в Python вызывает исключение
Я пытаюсь нарисовать произвольный четырехугольник над изображением, используя функцию полилиний в opencv. Когда я это делаю, я получаю следующую ошибку
ошибка OpenCV: ошибка утверждения (стр. checkVector (2, CV_32S) >= 0 в полилинии, файл / tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/модули / основные / src/d rawing.cpp, линия 2065
Я вызываю функцию как таковую,
cv2.polylines(img, points, 1, (255,255,255))
где точки - это массив numpy, как показано ниже (Размер изображения 1280x960):
[[910 641]
[206 632]
[696 488]
[458 485]]
и img - это просто нормальное изображение, которое я могу imshow. В настоящее время я просто рисую линии между этими точками, но я ищу более элегантное решение.
Как я должен исправить эту ошибку?
4 ответов
проблема в моем случае была в том, что 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, она должна была проверить dtype
)
эта функция недостаточно хорошо документирована, и ошибка также не очень полезна. Во всяком случае,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)
в приведенном выше примере будет напечатано следующее изображение (масштабированное):
ошибка говорит, что Ваш массив должен иметь размер 2. Поэтому измените массив следующим образом:
points = points.reshape(-1,1,2)
тогда он работает нормально.
кроме того, ответ, предоставленный jabaldonedo также отлично работает для меня.
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)
официальную документацию, давать разъяснения,нужно перекроить