2013-07-03 14 views
9

Sto provando a eseguire una deformazione complessa di un'immagine utilizzando il flusso ottico denso (sto cercando di convertire la seconda immagine nella stessa forma della prima immagine). Probabilmente sto ricevendo questo post tutto sbagliato, ma Ill up che cosa ho provato:Immagine di deformazione OpenCV basata su calcOpticalFlowFarneback

cv::Mat flow; 
cv::calcOpticalFlowFarneback(mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0); 

cv::Mat newFrame = cv::Mat::zeros(frame.rows, frame.cols, frame.type()); 
cv:remap(frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR); 

L'idea se che sto calcolando il tappetino flusso da 2 fotogrammi in scala di grigi. Ricevo un tappetino che sembra avere senso, ma ora sto cercando di rimappare la mia immagine originale (cioè non in scala di grigi) usando queste informazioni sul flusso.

Immagino che la funzione rimappa sia ciò che voglio ma ottengo un'immagine molto distorta da esso. Nessuna delle mie informazioni sul colore sopravvive affatto. Mi ritrovo semplicemente con un'immagine arancione e nera che ha una piccola somiglianza con la mia immagine originale.

Sto indovinando che sto fraintendendo la funzione Remap e o non fare quello che voglio fare e sto ottenendo qualcosa di sbagliato in quello che sto passando.

Se il ex qualcuno ha qualche suggerimento su come posso risolvere questo problema? Se quest'ultimo, cosa sto sbagliando?

Qualsiasi aiuto molto apprezzato!

+0

Ciao, ho visto questo post e ho approssimativamente lo stesso problema (esattamente lo stesso problema in modo definitivo) e mi stavo chiedendo se hai trovato un modo per farlo? (So ​​che questo post è vecchio, e mi dispiace, ma non trovo alcuna risposta in tempo reale: o) Grazie mille! –

+0

@RaphaelSchimchowitsch: Probabilmente è meglio iniziare la tua stessa domanda. Non lo sono se ho ancora il codice che ho scritto per fare questo ... Ho avuto qualcosa che funzionasse. Ora sicuro se fosse con flusso ottico però ... – Goz

+0

Ahah, ok, ho già postato la mia domanda ma ho trovato questo post quindi mi stavo chiedendo se potessi aiutarmi :) Ma ok ^^ Grazie mille per il tuo risposta :) –

risposta

13

La funzione remap non può funzionare con flusso ottico. La funzione remap trasforma l'immagine di origine utilizzando la mappa specificato:

dst(x, y) = src(mapx(x, y), mapy(x, y)) 

flusso ottico ha un'altra formula:

frame1(x, y) = frame2(x + flowx(x, y), y + flowy(x, y)) 

Quindi, per usare remap prima funzione è necessario creare una mappa da flusso:

Mat flow; // backward flow 
calcOpticalFlowFarneback(nextFrame, prevFrame, flow); 

Mat map(flow.size(), CV_32FC2); 
for (int y = 0; y < map.rows; ++y) 
{ 
    for (int x = 0; x < map.cols; ++x) 
    { 
     Point2f f = flow.at<Point2f>(y, x); 
     map.at<Point2f>(y, x) = Point2f(x + f.x, y + f.y); 
    } 
} 

Mat newFrame; 
remap(prevFrame, newFrame, map); 
+1

Brillante, questo spiega molto. Sfortunatamente il flusso non contiene i dati che pensavo facesse tornare al tavolo da disegno e probabilmente un'altra domanda presto! Grazie! – Goz

+3

Nota l'uso del flusso a ritroso, cioè da 'nextFrame' a' prevFrame'. Questo è necessario perché i vettori di flusso sono dati per i pixel di origine ("dove è andata?"), Mentre siamo interessati ai pixel di destinazione ("da dove viene questo"). – lapis