2015-12-31 17 views
5

Ich versuche, entlang der Kontur von Gesichtsmerkmalen, die über dsift mit Python 2.7 und openCV 2.4.11 erhalten wurden, Landmarken zu verfolgen. Ich möchte diese Funktionen zwischen Frames verfolgen.OpenCV Optical Flow Assertion

Ich erhalte jedoch den folgenden Fehler. Ich habe die Eingangsbilder 1-Kanal gleiche Abmessungen sind geprüft (und ohne Vorzeichen 8bit-Typ), und ebenfalls mit den i.Vj. Punkten:

OpenCV Error: Assertion failed ((npoints = prevPtsMat.checkVector(2, CV_32F, tru 
e)) >= 0) in cv::calcOpticalFlowPyrLK, file ..\..\..\modules\video\src\lkpyramid.cpp 
cv2.error: ..\..\..\modules\video\src\lkpyramid.cpp:845: error: (-215) (npoints 
= prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function cv::calcOpticalFlowP 
yrLK 

Linie verursacht Ausgabe:

new_pts, ttl, err = cv2.calcOpticalFlowPyrLK(self.old_img, i_img, i_old_pts, None) 

Hat jemand eine Ahnung, wo Ich kann damit beginnen, das zu debuggen?

+0

Bleibt ungelöst, wenn jemand helfen will – lukemtesta

Antwort

9

Ich hatte das gleiche Problem, wenn ich auf optischen Datenfluss basierte Tracking. Ich habe viele verschiedene Wege ausprobiert, um das zu lösen. Aber vergeblich.

Schließlich gab es ein Beispielprogramm, in dem sie mit shi-tomsi Eckpunkte Erkennung verfolgt und diese Punkte wurden im LK-Algorithmus verwendet und es hat perfekt funktioniert. Also untersuchte ich die Datentypen und Dimensionen der Ausgabe des Shi-Tomsi-Detektors und stellte sicher, dass meine zu verfolgenden Punkte vom selben Typ waren. Es wogte!

Hier ist, was Sie wissen müssen.

  • stellen Sie sicher, dass die Bilder Graustufen sind.
  • Ihr Koordinatenparameter, der i_old_pts ist, sollte Float32 mit einfacher Genauigkeit sein. Dieser Typ ist in anonymer Verwendung verfügbar. der float in python ist float64
  • der koordinatenparameter i_old_pts (aus ihrem programm) sollte ein numpy array mit der dimension (n, 1,2) sein, wobei n die anzahl der punkte darstellt.

Dies sollte funktionieren.

+0

np.float32 (coorX), np.float32 (coorY) half mir –

+0

Ich musste meine numpy Arrays initialisieren, um vom Typ 'np.float32' zu sein. –

+0

Vielen Dank! Ich verbringe Stunden damit, herauszufinden, was los ist. Die cv2-Python-Bindung sollte den erwarteten Parametertyp in den Dokumenten explizit erwähnen. Sie tun dies für die Signatur der C-Funktion (z. B. im Falle des Ecken-Arrays für die eckeSubPix-Funktion ihre Ecken CvPoint2D32f *). Lassen Sie 'Ecken' mein erstes Ecken-Array sein, dann habe ich' curves.astype (np.float32) ' – trueter

Verwandte Themen