1

je créer 3 cadres intermédiaires entre les deux cadres (prevImg, nextImg), I ont découvert le mouvement de chaque pixel en utilisant la fonction calcOpticalFlowFarneback() dans opencvtrames de mappage à base de mouvement

calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize, 
          iter, polyn, sigma, method); 

j'ai créé 3 les cadres intermédiaires en appelant la fonction CreateNewFrame(), avec décalage suivant (argument func). les valeurs de 0,25, 0,5, 0,75

void createNewFrame(Mat & frame, const Mat & flow, float shift, int & c, Mat & prev, Mat &next) 
{ 
    for (int y = 0; y < mapX.rows; y++) 
    { 
    for (int x = 0; x < mapX.cols; x++) 
    { 
     Point2f f = flow.at<Point2f>(y, x); 
     mapX.at<float>(y, x) = x + f.x/shift; 
     mapY.at<float>(y, x) = y + f.y/shift; 
    } 
    } 
    remap(frame, newFrame, mapX, mapY, INTER_LINEAR); 
} 

Mais je ne reçoivent pas les cadres intermédiaires appropriés .. la transition d'une trame t o l'autre n'est pas lisse (scintillement). Quel est le problème dans mon code? Qu'est-ce que je dois faire pour obtenir des cadres intermédiaires ? ?

+0

interpolation entre les images est un sujet de recherche active et d'obtenir de bons résultats est très difficile, en particulier sur les limites de mouvement/objet. Quoi qu'il en soit, vos questions impliquent que vous rencontrez des problèmes plus tôt. Si je comprends bien votre algorithme, vous "déplacez" les pixels de la première image le long des vecteurs de mouvement. Est-ce exact? Que voulez-vous dire par «non lisse»? Quelles parties des cadres intermédiaires ne donnent pas le bon résultat? –

+0

@ user_12 pouvez-vous donner des exemples d'images? nous pourrions être en mesure d'avoir une meilleure idée de ce qui ne va pas avec les cadres intermédiaires. – AruniRC

+0

J'ai ajouté mon programme sous forme compilable – Deepak

Répondre

1

Je pense que vous devriez multiplier par votre variable shift, ne pas diviser par elle.

Essayez de remplacer votre double boucle en fonction createNewFrame par le suivant:

for (int y = 0; y < mapX.rows; y++) 
    { 
    for (int x = 0; x < mapX.cols; x++) 
    { 
     Point2f f = flow.at<Point2f>(y, x); 
     mapX.at<float>(y, x) = x + f.x*shift; 
     mapY.at<float>(y, x) = y + f.y*shift; 
    } 
    } 
+1

ohh yess ........ – Deepak

+0

encore il y a une petite quantité de transition non lisse d'une image à l'autre, ce que je dois faire pour résoudre ce .. – Deepak

+0

Malheureusement, le flux optique estimé par calcOpticalFlowFarneback n'est pas parfait. Avez-vous essayé de le visualiser en réglant 'shift' sur' 1.'? – AldurDisciple