2012-12-03 19 views
8

Wielkie dzięki, jeśli ktoś może mi pomóc. Im spróbować użyć przykład książki "OReilly Informatyk Vision z Pythona", na koniec stronie 216.OpenCV Python calcOpticalFlowFarneback

#!/usr/bin/env python 

import cv2 
def draw_flow(im,flow,step=16): 
    h,w = im.shape[:2] 
    y,x = mgrid[step/2:h:step,step/2:w:step].reshape(2,-1) 
    fx,fy = flow[y,x].T 

    # create line endpoints 
    lines = vstack([x,y,x+fx,y+fy]).T.reshape(-1,2,2) 
    lines = int32(lines) 

    # create image and draw 
    vis = cv2.cvtColor(im,cv2.COLOR_GRAY2BGR) 
    for (x1,y1),(x2,y2) in lines: 
     cv2.line(vis,(x1,y1),(x2,y2),(0,255,0),1) 
     cv2.circle(vis,(x1,y1),1,(0,255,0), -1) 
    return vis 


cap = cv2.VideoCapture(0) 

ret,im = cap.read() 
prev_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

while True: 
    # get grayscale image 
    ret,im = cap.read() 
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

    # compute flow 
    #flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0) 
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,float(0),float(0),3,15,3,5,float(1),0) 
    prev_gray = gray 

    # plot the flow vectors 
    cv2.imshow('Optical flow',draw_flow(gray,flow)) 
    if cv2.waitKey(10) == 27: 
     break 

im wykonać w terminalu (LXUbuntu, lxterminal) i pojawia się błąd następująco:

VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
Traceback (most recent call last): 
    File "hw.py", line 35, in <module> 
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0) 
TypeError: a float is required 

rozumiem, że problem jest w calcOpticalFlowFarneback funkcji, ponieważ potrzebny jest numer w obrocie, a więc im spróbować calcOpticalFlowFarneback (prev_gray, szary, None, pływak (0.5), 3,15,3,5, pływak (1.2), 0) ale nie działa.

Wielkie dzięki.

+0

"wymagana jest pływak" będzie prawdopodobnie odnosi się do nie- float, nie-int argumenty na liście argumentów. – asheeshr

Odpowiedz

13

Musisz trochę zmienić kod.

Przede wszystkim zawierają bibliotekę NumPy od metod, takich jak mgrid, int32, vstack są funkcjami NumPy.

Więc na początku kodu, dodać:

from numpy import * 

drugie, zbliża się do pytania, czwarty argument powinien być int. Dostarczyłeś go jako float. Zrób 1 (lub 3, jak chcesz). I ostatni argument jest wyprowadzany sam. Nie potrzebujesz tego. Więc usuń to.

Więc moja końcowa deklaracja wyglądać jak poniżej (i to działa dobrze dla mnie):

flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,0.5,1,3,15,3,5,1) 

Spróbuj i daj mi znać, jeśli jakikolwiek błąd pochodzi.

2

Kiedy wywołać funkcję w następujący sposób, wyświetlany jest następujący komunikat o błędzie:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

Błąd:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
TypeError: a float is required 

Kiedy usunąć wartość None wtedy mój program działa poprawnie:

flow = cv2.calcOpticalFlowFarneback(prvs, next, 0.5, 3, 15, 3, 5, 1.2, 0) 

Funkcja nabiera kształtu:

cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow]) → flow 

Okazuje się, że nie powinniśmy przechodzić wartość None parametru pyr_scale. Możemy jednak przekazać None do parametru flow.

  • pyr_scale: parametr, określając wagę < obrazu (1) do budowy piramidy dla każdego obrazu; pyr_scale = 0.5 oznacza klasyczną piramidę, w której każda następna warstwa jest dwukrotnie mniejsza od poprzedniej.

  • flow: Obliczone obrazowania przepływu, który ma ten sam rozmiar co prvs i typu CV_32FC2.

+0

Jak zauważyli, jest to niepowiązany komentarz, jednak oto dlaczego tak się dzieje: Ponieważ funkcja przyjmuje różne parametry w pythonie 2 i pythonie 3. Dlatego upewnij się, że czytasz podręcznik pasujący do twojego środowiska. Możesz to sprawdzić za pomocą cv2.cv .__ version__ – GrigorisG

3

@sunside

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

cv2.calcOpticalFlowFarneback(prev, next, flow, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags) → flow 

jest opencv3.x grama, zobacz spodobać również opencv3.x doc

inaczej:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
TypeError: a float is required 

cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow]) 

trzeba zabrakło w opencv2.x, może być potwierdzono w ten sposób:

import cv2 
print cv2.__version__ 

Zobacz opencv2.x doc

1

Jeśli używasz Python3, włóż w def draw_flow

y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1).astype(int) 
flow = cv2.calcOpticalFlowFarneback(prevgray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

dla Pythona 2 należy użyć

y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1) 
flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)