2015-12-31 13 views
5

Próbuję śledzić punkty orientacyjne wzdłuż konturu rysów twarzy uzyskanych za pomocą funkcji dsift z pythonem 2.7 i openCV 2.4.11. Chcę śledzić te funkcje między ramkami.Asercja przepływu optycznego OpenCV

Jednak otrzymuję następujący błąd. Sprawdziłem obrazy wejściowe są 1-kanałowe równe wymiary (i niepodpisane typ 8bit), podobnie z punktami prev:

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 

Linia powoduje problem:

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

Czy ktoś ma jakiś pomysł, gdzie Mogę rozpocząć debugowanie tego?

+0

Pozostaje nierozwiązany, jeśli ktoś chce pomóc – lukemtesta

Odpowiedz

9

Miałem ten sam problem, kiedy robiłem śledzenie oparte na przepływie optycznym. Próbowałem rozwiązać wiele różnych sposobów. Ale na próżno.

W końcu, był przykładowy program, w którym śledzono za pomocą detekcji punktów narożnych shi-tomsi i te punkty były używane w algorytmie LK i działało idealnie. Sprawdziłem więc typy danych i wymiary wyjścia detektora Shi-Tomsi i upewniłem się, że śledzone punkty są tego samego typu. To woked!

Oto, co musisz wiedzieć.

  • upewnij się, że obrazy są w skali szarości.
  • Parametr współrzędnych, którym jest i_old_pts, powinien być zmiennoprzecinkową precyzją oznaczającą float32. Ten typ jest dostępny w programie numpy. float w pythonie to float64
  • parametr współrzędnych i_old_pts (z twojego programu) powinien być tablicą numpy z wymiarem (n, 1,2), gdzie n oznacza liczbę punktów.

To powinno zadziałać.

+0

np.float32 (coorX), np.float32 (coorY) pomógł mi –

+0

Musiałem zainicjować moje numpy tablice, aby być typu 'np.float32'. –

+0

Dziękuję bardzo! Spędzam wiele godzin próbując dowiedzieć się, co się dzieje. Powiązanie pythona cv2 powinno jawnie wspomnieć o oczekiwanym typie parametru w dokumentach. Robią to dla podpisu funkcji C (np. W przypadku macierzy narożnej dla funkcji CornerSubPix jej narożniki CvPoint2D32f *). Niech 'corners' będzie moją początkową tablicą narożną, a następnie użyłem' corners.astype (np.float32) ' – trueter

Powiązane problemy