Bonjour.
J'ai récemment essayé quelques exemples de base en lecture de videos (.avi) à l'aide d'opencv.
Apparemment, il semble que le fait que je sois sous linux cause des problèmes: en effet, sur une vidéo qui compte 400 frames et des poussières, je n'en lit que 68, ceci avec un certain nombre de saut de frames avant de recevoir une frame nulle (le tout à l'aide de cvQueryFrame).
D'autre partl la fonction cvGetCaptureProperty avec comme second argument CV_CAP_PROP_FRAME_COUNT sensée renvoyer le nombre de frames renvoie toujours zéro. j'ai toutefois pu contourner le problème à l'aide de la fonction ci dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int getAVIFrames(char * fname) {
char tempSize[4];
// Trying to open the video file
std::ifstream videoFile( fname , std::ios::in | std::ios::binary );
// Checking the availablity of the file
if ( !videoFile ) {
std::cout << "Couldnt open the input file " << fname << std::endl;
return 0;
}
// get the number of frames
videoFile.seekg( 0x30 , std::ios::beg );
videoFile.read( tempSize , 4 );
int frames = (unsigned char ) tempSize[0] + 0x100*(unsigned char ) tempSize[1] + 0x10000*(unsigned char ) tempSize[2] + 0x1000000*(unsigned char ) tempSize[3];
videoFile.close( );
return frames;
} |
enfin, la fonction cvSetCaptureProperty qui devrait normalement changer le numéro de la frame en cours n'a strictement aucun effet sur le flux vidéo, même lorsque l'argument de position est à une valeur fixe comme 0 ou 1 (les frames se déroulent les unes après les autres).
J'ai l'impression que cela est lié à un problème de codecs, mais je ne vois absolument pas comment résoudre ce problème ou éventuellement quel for mat utiliser pour que-ceux-cis n'aient pas lieu.
J'ai également rendu la video "propre" (format uncompressed et autre à l'aide de MEncoder:
mencoder tree.avi -ovc raw -vf format=i420 -o tree2.avi
Si vous avez une idée... 
D'autre part, je ne sais pas si ce sujet répond de ce forum ou du forum linux... peut-être des deux....
Cordialement ...
Partager