web-dev-qa-db-fra.com

Les polylignes d’openv fonctionnent en python jette une exception

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?

23
Ashok

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)

37
Vanuan

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):

enter image description here

25
jabaldonedo

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.

4
Abid Rahman K
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

0
xm L