installing - python opencv programming
La función de polilíneas de Opencv en Python arroja una excepción (4)
El problema en mi caso era que numpy.array
creaba números de numpy.array
int64
por defecto. Así que tuve que convertirlo explícitamente a 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))
(Parece un error en el enlace cv2 python, debería haber verificado dtype
)
Estoy tratando de dibujar un cuadrilátero arbitrario sobre una imagen usando la función de polilíneas en opencv. Cuando lo hago, recibo el siguiente error
Error de OpenCV: error de aserción (p.checkVector (2, CV_32S)> = 0) en polilíneas, archivo /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp, línea 2065
Llamo a la función como así,
cv2.polylines(img, points, 1, (255,255,255))
Donde los puntos son tan nudosos como se muestra a continuación (El tamaño de la imagen es 1280x960):
[[910 641]
[206 632]
[696 488]
[458 485]]
e img es solo una imagen normal que puedo mostrar. Actualmente estoy dibujando líneas entre estos puntos, pero estoy buscando una solución más elegante.
¿Cómo debo corregir este error?
Esta función no está suficientemente documentada y el error tampoco es muy útil. En cualquier caso, cv2.polylines
espera una lista de puntos, simplemente cambie su línea a esto:
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)
El ejemplo anterior imprimirá la siguiente imagen (reescalada):
el error dice que su matriz debe ser de dimensión 2. Por lo tanto, modifique la matriz de la siguiente manera:
points = points.reshape(-1,1,2)
Entonces funciona bien.
Además, la respuesta proporcionada por jabaldonedo también funciona bien para mí.
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)
La documentación oficial para proporcionar una explicación, necesita una nueva forma