2016-05-05 22 views
3

Ich kann nicht verstehen, wie Matlab die Geschwindigkeitsmatrix eines Videorahmens durch Optical Flow unter Verwendung des aktuellen Rahmens berechnet. Die Geschwindigkeit wäre nicht eine Relation der verschiedenen Pixel Position in der Zeit variiert was würde die Analyse von zwei Bildern oder mehr pro Zeit?Berechnen der Objektgeschwindigkeit in Videobildern - Optischer Fluss (Matlab)

http://www.mathworks.com/help/imaq/examples/live-motion-detection-using-optical-flow.html?requestedDomain=www.mathworks.com

http://www.mathworks.com/help/vision/ref/vision.opticalflow-class.html

% Set up for stream 
nFrames = 0; 
while (nFrames<100)  % Process for the first 100 frames. 
    % Acquire single frame from imaging device. 
    rgbData = step(vidDevice); 

    % Compute the optical flow for that particular frame. 
    optFlow = step(optical,rgb2gray(rgbData)); %***HERE IS THE DOUBT! iT JUST USES ONE FRAME!!!*** 

    % Downsample optical flow field. 
    optFlow_DS = optFlow(r, c); 
    H = imag(optFlow_DS)*50; 
    V = real(optFlow_DS)*50; 

    % Draw lines on top of image 
    lines = [Y(:)'; X(:)'; Y(:)'+V(:)'; X(:)'+H(:)']; 
    rgb_Out = step(shapes, rgbData, lines'); 

    % Send image data to video player 
    % Display original video. 
    step(hVideoIn, rgbData); 
    % Display video along with motion vectors. 
    step(hVideoOut, rgb_Out); 

    % Increment frame count 
    nFrames = nFrames + 1; 
end 
+0

Ich denke, es hängt davon ab, was die "step" -Funktion tut. Aber wenn man den Code nur anschaut, sieht es so aus, als ob er den nächsten Frame bekommt. Um 'rgbdata' zu erhalten, benutzt der Code' step' und in der nächsten Zeile 'step'. Das heißt, dass diese Zeile den nächsten Frame erfasst und den optischen Fluss zusammen berechnet –

Antwort

1

vision.OpticalFlow ist eine Klasse. Wenn Sie ein vision.OpticalFlow-Objekt erstellen und dessen step-Methode aufrufen, merkt es sich den Rahmen, den Sie übergeben. Dann berechnet es bei jedem folgenden Anruf an step den optischen Fluss zwischen dem gespeicherten Frame vom letzten Anruf und dem aktuellen Frame.

Übrigens ist vision.OpticalFlow veraltet. Wenn Sie eine aktuelle Version von MATLAB haben, gibt es eine Reihe von optischen Flussfunktionen, die Sie verwenden können: opticalFlowFarneback, opticalFlowHS, opticalFlowLK und opticalFlowLKDoG.

+0

Vielen Dank für Ihre Hilfe ! Ich werde diese beiden Methoden ausprobieren, um zu sehen, wie es in meinem realen Projekt funktioniert. –