tutorial programming installing gui docs con python opencv numpy points

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