IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

calcOpticalFlowSF et calcOpticalFlowFarneback


Sujet :

OpenCV

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut calcOpticalFlowSF et calcOpticalFlowFarneback
    Bonjour,

    J'essaie de calculer le flot optique dans une vidéo, or je programme en C++ depuis peu (Visual Studio express 2010 & opencv 2.4.8

    J'ai des problèmes pour chacune de ces fonctions :

    ** calcOpticalFlowSF : j'utilise un programme trouvé sur internet (le simpleflow_demo me paraît bien compliqué, mais l'appel de la fonction est similaire) et qui fonctionne selon son créateur.
    Or une fois arrivé à cette fameuse fonction mon débogueur en mode "pas à pas" rentre dans la fonction Vector reviens à la page principal est ... disparaît . Le programme continue de tourner sans s'arrêter, aucune erreur n'est affiché.... Je met le code ci après (code 1)

    **calcOpticalFlowFarneback : cette fois ci tout fonctionne(là encore un code trouvé sur internet, CODE 2), sauf qu'à la fin j'obtiens uniquement des points (et j'ai testé sur plusieurs vidéo et avec plusieurs frames différentes) alors si vous avez des idées...


    En attendant je vais tester tvl1_optical_flow, le dernier sera peut être le bon !!

    D'avance merci,

    Cordialement,

    Ronan



    CODE 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Mat frame1 = imread("/home/radford/Desktop/1.png");
    Mat frame2 = imread("/home/radford/Desktop/2.png");
     
    namedWindow("flow");
    Mat flow;
     
    calcOpticalFlowSF(frame1, frame2, flow, 3, 2, 4);
     
    Mat xy[2];
    split(flow, xy);
     
    //calculate angle and magnitude
    Mat magnitude, angle;
    cartToPolar(xy[0], xy[1], magnitude, angle, true);
     
    //translate magnitude to range [0;1]
    double mag_max;
    minMaxLoc(magnitude, 0, &mag_max);
    magnitude.convertTo(magnitude, -1, 1.0/mag_max);
     
    //build hsv image
    Mat _hsv[3], hsv;
    _hsv[0] = angle;
    _hsv[1] = Mat::ones(angle.size(), CV_32F);
    _hsv[2] = magnitude;
    merge(_hsv, 3, hsv);
     
    //convert to BGR and show
    Mat bgr;//CV_32FC3 matrix
    cvtColor(hsv, bgr, COLOR_HSV2BGR);
    imshow("flow", bgr);
    CODE 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void flot_F(Mat frame1,Mat frame2)
    {
     
    		Mat flow= Mat::zeros(frame1.size(),CV_32FC2);
    		Mat prev = Mat::zeros(frame1.size(),frame1.type());
    		Mat next = Mat::zeros(frame1.size(),frame1.type());
    		cvtColor(frame1,prev,CV_RGB2GRAY);
    		cvtColor(frame2,next,CV_RGB2GRAY);
     
    		calcOpticalFlowFarneback(prev,next,flow, 0.5, 3, 15, 3, 5, 1.2, 0);
     
    	            drawOptFlowMap(flow, prev, 16, 1.5, CV_RGB(0, 255, 0));
    	            imshow("flow", prev);
    }
     
    void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step,double scale, const Scalar& color)
    {
    	    for(int y = 0; y < cflowmap.rows; y += step)
    	        for(int x = 0; x < cflowmap.cols; x += step)
    	        {
    	            const Point2f& fxy = flow.at<Point2f>(y, x);
    	            line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)),
    	                 color);
    	            circle(cflowmap, Point(x,y), 2, color, -1);
    	        }
    }

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Bon mon algorithme de capture d'image était faux donc les algorithmes avaient la même image en entrée.

    J'ai réussi à faire fonctionner calcOpticalFlowFarneback et tvl1_optical_flow mais par contre calcOpticalFlowSF reste une boîte noire ...

    Modification : en fait calcOpticalFlowSF fonctionne c'est juste qu'il est extrêmement lent .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cvCalcOpticalFlowHS ou calcOpticalFlowFarneback?
    Par medchafik dans le forum OpenCV
    Réponses: 0
    Dernier message: 07/02/2014, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo