0

Ich habe ein kleines Projekt über Bewegliche Objekterkennung in beweglichen Kameras, in denen ich negativen optischen Flussvektor verwenden muss, um Ich-Bewegungskompensation zu minimieren. Ich habe ein Video und einige bestimmte aufeinanderfolgende Frames, in denen der Durchschnitt des negativen optischen Flussvektors berechnet werden muss. Ich habe bereits den optischen Fluss zwischen sagen, (k-1) th und kth Rahmen berechnet. Außerdem habe ich den Durchschnitt des optischen Flussvektors V = [u, v] berechnet, wobei v der Durchschnitt der horizontalen optischen Strömung und u der Durchschnitt der vertikalen Strömung ist. Nun muss ich das Inverse des optischen Flussvektors, d. H. -V, auf den (k-1) -ten Frame anwenden. Ich bin Matlab neu und ich weiß nicht viel darüber. Bitte helfenWie man den inversen optischen Flussvektor auf ein Bild anwendet?

ich diesen Code Segment versucht haben, dies zu tun, aber die Ergebnisse sind nicht

erwartet

function I1=reverseOF(I,V) R=I(:,:,1); G=I(:,:,2); B=I(:,:,3); [m,n]=size(rgb2gray(I)); for i=1:m for j=1:n v1=[j i]; v2=-V; v3=v1.*v2; R(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=R(i,j); G(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=G(i,j); B(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=B(i,j); I1(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=I(i,j); end end I1=cat(3,R,G,B); enter code here

Ich habe abs() Funktion verwendet, da sonst ein Fehler war auftreten wie „versucht negativ zuzugreifen Ort; Index muss positiv oder logisch sein ".

Bild A und Bild B sind die Bilder, die ich verwendet habe, um den optischen Fluss zu schätzen. enter image description here

Dies ist das Ergebnis, das ich nach Anwendung der obigen Funktion erhalte. enter image description here

+0

können Sie erarbeiten mehr, wenn Sie sagen, "nicht wie erwartet"? Können Sie Bilder hinzufügen? Es ist nicht klar, was du mit "invers" meinst. In der Tat machst du die Berechnung "gegenüber" ... – giosans

+0

@Giosans, ich habe die Bilder oben aktualisiert. Und nicht wie erwartet ist, dass ich den Effekt des optischen Flusses in dem (k-1) -ten Bild umkehren muss, um die durch die Kamerabewegung auftretende Ego-Bewegung zu minimieren. –

+0

Sorry @Neeraj, ich weiß nicht, was ist Ego-Bewegung, ich weiß nicht, was ist V (eine Matrix, eine Zahl?!?), Ich weiß nicht, was ReverseOF-Funktion und warum Sie zwei for-Schleifen. Versuchen Sie, über jede Codezeile zu kommentieren und schreiben Sie allgemeine mathematische Ausdrücke anstelle von physikalischen Begriffen [wie Optical Flow], mit denen viele Leute nicht vertraut wären. – giosans

Antwort

2

Leider können Sie dies nicht einfach tun. Dies ist ein ziemlich fortgeschrittenes Forschungsproblem, weil das Erhalten der Umkehrung eines Vektorfeldes auf einem Gittergitter kein einfaches Problem ist, tatsächlich ist es ziemlich schwierig.

Beachten Sie, dass Ihr Vektorfeld (optischer Fluss) in einem Gitternetz beginnt, aber nicht in einem Gitternetz endet, sondern in zufälligen Subpixelpositionen endet. Wenn Sie dieses Feld einfach umkehren, ist -V nicht genug! Das Ergebnis wird nicht umgekehrt sein!

Dies ist ein offenes Forschungsproblem, zum Beispiel unter this 2010 paper, die genau dieses Problem adressiert, und schlägt eine Methode zum Erstellen von "Pseudoinverses".

Angenommen, Sie haben das inverse, weil Sie es irgendwie berechnet haben. Ihr Code ist ziemlich schlecht dafür, und die Lösungen (abs!) Zeigen (nichts für ungut), dass Sie nicht wirklich verstehen, was Sie tun. Für ein bekanntes Vektorfeld {Vx,Vy}, entspricht die Größe der Bildgröße (wenn sie nicht, können Sie leicht herausfinden, wie es zu interpolieren unsig interp2) der Code etwas aussehen würde:

newimg=zeros(size(I)); 

[ix,iy]=meshgrid(1:size(I,1),1:size(I,2)); 

newimg(:,:,1)=interp2(I(:,:,1),ix+Vx,iy+Vy); % this is your whole loop. 
newimg(:,:,2)=interp2(I(:,:,3),ix+Vx,iy+Vy); % this is your whole loop. 
newimg(:,:,3)=interp2(I(:,:,2),ix+Vx,iy+Vy); % this is your whole loop. 
Verwandte Themen