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 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
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 : 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); } }
Partager