J'essaie de dessiner un quadrilatère arbitraire sur une image en utilisant la fonction polylignes de manière ouverte. Quand j'obtiens l'erreur suivante
Erreur OpenCV: l'assertion a échoué (p.checkVector (2, CV_32S)> = 0) dans polylignes, fichier /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp, ligne 2065
J'appelle la fonction comme telle,
cv2.polylines(img, points, 1, (255,255,255))
Où points correspond au tableau numpy, comme indiqué ci-dessous (la taille de l'image est de 1280x960):
[[910 641]
[206 632]
[696 488]
[458 485]]
et img est juste une image normale que je suis capable d'imshow. Actuellement, je dessine moi-même des lignes entre ces points, mais je cherche une solution plus élégante.
Comment dois-je corriger cette erreur?
Le problème dans mon cas était que numpy.array
créait des numéros int64
- bits par défaut. Je devais donc explicitement le convertir en 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))
(On dirait un bug dans la liaison cv2 python, il aurait dû vérifier dtype
)
Cette fonction n'est pas assez bien documentée et les erreurs ne sont pas très utiles non plus. Dans tous les cas, cv2.polylines
attend une liste de points, changez simplement votre ligne pour ceci:
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)
L'exemple ci-dessus imprimera l'image suivante (redimensionnée):
l'erreur indique que votre tableau doit être de dimension 2. Donc, remettez en forme le tableau comme suit:
points = points.reshape(-1,1,2)
Alors ça marche bien.
En outre, la réponse fournie par jabaldonedo fonctionne également très bien pour moi.
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 documentation officielle à fournir pour expliquer , doit être remodelée