Je cherche à utiliser l'algorithme de block matching. J'ai cherché dans la doc d'openCv et j'ai trouvé une fonction qui permet de faire ça : cvCalcOpticalFlowBM
voici le code que j'ai écrit:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
 
int main()
{
    IplImage* ImTemp1=NULL;
    IplImage* source1=NULL;
    IplImage* ImTemp2=NULL;
    IplImage* source2=NULL;
    CvCapture *input_video = cvCaptureFromFile("video.avi");
    cvSetCaptureProperty(input_video, CV_CAP_PROP_POS_FRAMES,10);
    ImTemp1=cvCloneImage(cvQueryFrame(input_video));
    cvSetCaptureProperty(input_video, CV_CAP_PROP_POS_FRAMES,11);
    ImTemp2=cvCloneImage(cvQueryFrame(input_video));
    source1 = cvCreateImage(cvGetSize(ImTemp1), IPL_DEPTH_8U, 1);
    source2 = cvCreateImage(cvGetSize(ImTemp2), IPL_DEPTH_8U, 1);
    cvCvtColor(ImTemp1, source1, CV_BGR2GRAY);
    cvCvtColor(ImTemp2, source2, CV_BGR2GRAY);
 
    cvNamedWindow("Pic1", CV_WINDOW_AUTOSIZE);
    cvShowImage("Pic1", source1);
 
    cvNamedWindow("Pic2", CV_WINDOW_AUTOSIZE);
    cvShowImage("Pic2", source2);
 
 
    IplImage* velocityX=NULL;
    IplImage* velocityY=NULL;
    velocityX = cvCreateImage(cvGetSize(source1), IPL_DEPTH_32F, 1);
    velocityY = cvCreateImage(cvGetSize(source1), IPL_DEPTH_32F, 1);
 
    cvCalcOpticalFlowBM(source1, source2, cvSize(4, 4), cvSize(1, 1), cvSize(4, 4), 0, velocityX, velocityY);
 
    cvNamedWindow("Horizontal", CV_WINDOW_AUTOSIZE);
    cvShowImage("Horizontal", velocityX);
 
    cvNamedWindow("Vertical", CV_WINDOW_AUTOSIZE);
    cvShowImage("Vertical", velocityY);
 
    cvDestroyWindow("Pic1");
    cvDestroyWindow("Pic2");
    cvDestroyWindow("Horizontal");
    cvDestroyWindow("Vertical");
 
    cvReleaseImage(&ImTemp1);
    cvReleaseImage(&ImTemp2);
    cvReleaseImage(&source1);
    cvReleaseImage(&source2);
    cvReleaseImage(&velocityY);
    cvReleaseImage(&velocityX);
    cvReleaseCapture(&input_video);
    return 0;
}
Le code compile bien mais à l'exécution il se plante et il affiche une erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Sizes of input arguments do not match()
in function cvCalcOpticalFlowBM C:\..\cvoptflowbm.cpp(592)
L'erreur vient des tailles des blocs je pense.
Avez vous une idée sur les paramètres correctes de cette fonction?
Merci