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 :

Projet C++ avec OpenCV "Shot Detection"


Sujet :

OpenCV

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Projet C++ avec OpenCV "Shot Detection"
    Bonjour, j'ai un projet en C++ avec OpenCV qui vise à reconnaitre des changements de scènes dans les vidéos. Nous sommes nouveau à ce domaine et il nous faut rendre le projet dans moins de deux semaines. Nous avons réussi les premiers pas mais nous ne parvenons pas à implémenter nos algorithmes.

    Nous avons pu ouvrir le fichier vidéo et l'afficher sur une fenêtre Windows. Maintenant il reste à faire ce truc:

    - utiliser cvQueryFrame pour prendre un "frame"
    - comparer chaque valeur des pixels de couleur de ce "frame" avec celle des pixels du "frame" précédent (la même position)
    - si la différence dépasse un certain seuil (qu'on définira arbitrairement), il faut "couper" la vidéo à ce moment-là et créer un nouveau fichier contenant seulement les "frames" depuis le dernier coupure jusqu'à ce nouveau.

    Nous avons du mal à implémenter cet algorithme (le plus simple parmi ceux que nous avons) car nous n'avons jamais fait un tel travail auparavant. Si vous avez des idées, pourriez-vous nous aider ?

    Nous vous remercions beaucoup.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    J'ai commence avec OpenCv il y a pas longtemps aussi mais je peux vous aider avec ca :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include "stdafx.h"
    #include "cv.h"			
    #include "highgui.h"
    #include "cvaux.h"
    #include <stdio.h>
    #include <fstream>
    #include <sstream>
    #include <math.h>
    #include <windows.h>
    #include <iostream>
    using namespace std;
     
    IplImage *frame ;
    IplImage *prev_frame ;
     
    int main()
    {
    	//creation of the stucture of video capture and the 
    	CvCapture *capture =NULL;
    	capture = cvCaptureFromAVI("nomDuFichier.avi");
    	//creation of the image that will receive the frames
    	frame = cvQueryFrame(capture);
    	frame_copy=cvCloneImage(frame);
    	prev_frame=cvCloneImage(frame);
    	//check if it has worked
    	if(frame == NULL)
    	{ 
    		printf("Bad video");
    		exit(1);
    	}
     
    	CvScalar old_pixel;
    	CvScalar new_pixel;
    	int diff = 0;
    	int nbScenes = 1;
    	string filename;
    	CvVideoWriter * writer = cvCreateVideoWriter("1.avi",0,30,cvGetSize(frame),0);
     
     
    	//for all the frames
    	for( int f = 1;frame;frame=cvQueryFrame(capture),f++)
    	{
    		//pour cette partie il y a peut-etre quelquechose de jeja implemente sous openCV(a vous de voir)
    		for (int i = 0; i < frame->height; i++)
    		{
    			for (int i = 0; i < frame->height; i++)
    			{
    				old_pixel = cvGet2D(prev_frame,i,j);
    				new_pixel = cvGet2D(frame,i,j);
    				diff = diff + (abs(old_pixel.val[0]-new_pixel.val[0])+abs(old_pixel.val[1]-new_pixel.val[1]) abs(old_pixel.val[2]-new_pixel.val[2]));
    			}
    		}
    		if (diff > seuilQueVousChoisirez)
    		{
    			nbScenes++;
    			ostringstream os;
    			os<<nbScenes<<".avi";
    			filename.append(os.str());
    			writer = cvCreateVideoWriter(filename.c_str(),0,30,cvGetSize(frame),0);
    		}
    		cvWriteFrame(writer,frame);
    		prev_frame=cvCloneImage(frame);
    		filename.clear();
    	}
    	cvDestroyWindow("Frame");
    	cvReleaseCapture(&capture);
     
    	return 0;
     
    }
    C'est du vite fait donc c'est pas tout juste a mon avis mais ca vous donne une base pour commencer. Une fois que vous aurez compris ca le reste va tout seul.

    edit: j'ai juste change trois lignes du code au-dessus ou il y avait une mechante erreur

  3. #3
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Ouiai par exemple il a oublié le cas de la première frame ou tu peux pas la comparer à la frame d'avant

    edit : à non y'a ca qui traine au début ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prev_frame=cvCloneImage(frame);
    manque le while pour faire tourner le programme attention ou vous allez le placer si vous le placez avant la ligne que j'ai quoté vous allez écrire par dessus votre enregistrement de la frame d'avant.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Ouiai par exemple il a oublié le cas de la première frame ou tu peux pas la comparer à la frame d'avant

    edit : à non y'a ca qui traine au début ^^

    Code :

    prev_frame=cvCloneImage(frame);
    Non snowy ca ne posera pas de probleme la logique de ce que j'ai ecrit est bonne. Quand je disais qu'il pouvait y avoir des erreurs ca serait plutot dans les details type nom de variables qui sont pas declares, etc...
    manque le while pour faire tourner le programme attention ou vous allez le placer si vous le placez avant la ligne que j'ai quoté vous allez écrire par dessus votre enregistrement de la frame d'avant.
    Je vois pas ce que tu veux dire, j'ai pas mis de while mais un for et ca tournera exactement pareil...

  5. #5
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    oups c'est une video autant pour moi j'ai toujours l'habitude de travailler sur une image provenant d'une cam ^^
    quand à la première frame la logique voudrait que tu ne la compare pas tu fais un traitement qui sert à rien vue que tu sais que c'est la même frame. Mais bon c'est anecdotique ^^

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Merci de votre réponse, et de vos idées aussi. Voilà le code que nous avons dévelpopé, il n'y a pas de bug mais quelque chose ne marche pas avec le boucle while.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #include <cv.h>
    #include <highgui.h>
    #include <iostream>
     
    using namespace std;
     
     
    int main() {
      // Charger le fichier
      CvCapture* capture = cvCaptureFromFile("F:\wmv.wmv");
     
      // Verifier si le fichier est bien charge
      if( !capture ) {
        fprintf( stderr, "ERROR: capture is NULL \n" );
        getchar();
        return -1;
      }
     
      // Create a window in which the captured images will be presented
      // Creer une fenetre
      cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
      IplImage* frame0 = cvQueryFrame(capture);
      int i=0;
     
      // Show the image captured from the file in the window and repeat
      while( 1 ) {
        // Get one frame
        IplImage* frame = cvQueryFrame( capture );
        i=i++;
     
        // If there is still an other frame after this frame, show it
        if( !frame ) {
          fprintf( stderr, "ERROR: frame is null...\n" );
          getchar();
          break;
        }
        float largeur = frame->width;
        float hauteur = frame->height;
        float a; float seuil=3; float coefficient=0.000025; float b=0;
        CvScalar scalaire;
        CvScalar scalaire0;
     
        for(float x=0; x<frame->width; x++)
        {
            for(float y=0; y<frame->height; y++)
            {
                // On récupère le pixel (x,y) de l'image.
                scalaire=cvGet2D(frame, y, x);
                scalaire0=cvGet2D(frame0, y, x);
                //différence entre les valeurs des pixels
                a = scalaire.val[0] - scalaire0.val[0];
                /* cout << a << endl; */
                if (abs(a) > seuil)
                    {
               //compter le nombre de pixel 
               //dont la différence des valeurs excède le seuil
                        b=b++;
                    }
            }
        }
         // Si le nombre de pixels excède le nombre total
         // de pixels dans le frame multiplié par un facteur 'coefficient'
        if (b > (largeur * hauteur * coefficient))
        {
            cout << ("Changement de scene a ", i, "eme frame") << endl;
        }
        cvShowImage( "mywindow", frame );
        cvWaitKey(10);
        // Do not release the frame!
     
        frame0=frame;
        //frame0 prend les valeurs de frame actuel
        //et sera utilisé dans le boucle suivant
     
        //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
        //remove higher bits using AND operator
        if( (cvWaitKey(10) & 255) == 27 ) break;
      }
     
      // Release the capture device housekeeping
      cvReleaseCapture( &capture );
      cvDestroyWindow( "mywindow" );
      return 0;
    }
    Notre problème est le boucle
    car quand nous faisons la soustraction, le résultat est toujours zéro.

    De plus il y a des problèmes avec les interfaces:

    - comment charger une vidéo comme avec les autres applications (ici nous devons charger depuis le code source en indiquant le nom du fichier) car nous n'avons pas d'expérience avec OpenCV
    - "couper" ces segments de vidéo (nous avons pensé à sauvegarder un segment une fois il y a le changement mais nous ne savons pas comment l'implémenter)

    Nous allons consulter le code que vous avez proposez, il peut nous aider à résoudre ce problème.

    Si vous avez encore des idées, nous vous en remercions beaucoup plus.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Votre probleme de soustraction toujours egale a 0 ne viens pas d'OpenCv mais d'un souci de programmation en general. Ici frame est un pointeur sur IplImage donc quand vous faites frame0 = frame vous faites pointer frame0 sur la meme chose que frame.
    Pour faire ca correctement je vous est mis dans l'exemple cvCloneImage() qui sert justement a eviter ce genre d'erreurs.
    comment charger une vidéo comme avec les autres applications (ici nous devons charger depuis le code source en indiquant le nom du fichier) car nous n'avons pas d'expérience avec OpenCV
    Ici une solution est de passer le nom du fichier en parametre lors de l'appel du programme ou de creer une interface ou l'utilisateur peut lui meme taper le nom du fichier.
    "couper" ces segments de vidéo (nous avons pensé à sauvegarder un segment une fois il y a le changement mais nous ne savons pas comment l'implémenter)
    Pour ecrire des fichiers videos OpenCv enregistre simplement les frames une par une. Donc le moyen de proceder est d'enregistrer les frames jusqu'a un changement de sequence puis de continuer a enregistrer dans un autre fichier. Dans l'exemple que je vous ai donne ca aussi c'est implemente.
    Bonne chance.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Oui je l'ai lu et j'ai trouvé ces fonctions. Merci beaucoup GlenNous allons l'essayer.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    J'ai rencontré un nouveau problème, et je ne comprends pas trop ce dont il s'agit. Vous pouvez me donner des conseils svp ? Merci beaucoup.

    Le cvWriteFrame ne marche pas, je pense qu'il faut utiliser cvGrabFrame, qu'en pensez-vous ?
    Images attachées Images attachées  

  10. #10
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Non c'est sur que le cvWriteFrame fonctionne bien je m'en suis beaucoup servi. Je pense que votre erreur viens des parametres que vous passez a cvCreateVideoWriter, voici la doc :
    cvCreateVideoWriter
    Creates video file writer

    typedef struct CvVideoWriter CvVideoWriter;
    CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
    filename
    Name of the output video file.
    fourcc
    4-character code of codec used to compress the frames. For example, CV_FOURCC('P','I','M','1') is MPEG-1 codec, CV_FOURCC('M','J','P','G') is motion-jpeg codec etc. Under Win32 it is possible to pass -1 in order to choose compression method and additional compression parameters from dialog.
    fps
    Framerate of the created video stream.
    frame_size
    Size of video frames.
    is_color
    If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).
    The function cvCreateVideoWriter creates video writer structure
    Dans votre erreur il est precise que le videoWriter attend une image en niveau de gris alors que si j'ai bien compris vous travaillez avec de la couleur donc ma premiere intuition serait de changer le parametre iscolor.
    Bonne chance!

  11. #11
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    il faut mettre isColor à 1 pour encoder des frames couleur.

  12. #12
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Par défaut
    Bonjour tout le monde

    J'ai lu le topic et je m'en suis inspiré pour faire un programme de shot detect. Il m'affiche les vidéos, mais je ne peux pas les lire.

    Je me permet de m'incruster dans votre discution, ce qui évite de créer un nouveau topic sur ce sujet ^^

    Je code sous linux. Merci pour votre aide.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
     
    #include <opencv/cv.h>
    #include <opencv/highgui.h>
    #include <stdio.h>
     
    // Create a string
    using namespace std;
     
    // Image to capture the frame from video
    IplImage* image = NULL;        // original image
    IplImage* lastImage = NULL;    // last image
    IplImage* diffImage = NULL;    // differences between images
    IplImage* threshImage = NULL;  // threshold image
    IplImage* mjpegImage = NULL;
     
    // Function protoype for characteristics about a video
    void showCaptureProperties(CvCapture* capture)
    {
    	// Read the video's frame size out of the avi
    	int  width, height, framePerSecond;
     
    	width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
    	height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
    	framePerSecond = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
    	printf("Video properties ( width*height - frame per seconde ): %d*%d - %d\n", width, height, framePerSecond);
    }
     
    // Main function, defines the entry point for the program
    int main(int argc, char** argv)
    {
    	// Structure for getting video from avi
    	CvCapture* capture = 0;
     
    	// Image to capture the frame from video
    	IplImage* frame = NULL;
     
    	// Check for the correct usage of the command line    
    	if(argc > 1)
    		capture = cvCaptureFromAVI(argv[1]); 
     
    	if(!capture)
    	{
    		fprintf(stderr,"Could not initialize capturing...\n");
    		return -1;
    	}   
     
    	// The Linux version of OpenCV has a bug. You need to read a frame before an AVI's properties can be queried.
    	cvQueryFrame(capture);
     
    	// Read the video's frame size out of the avi
    	if(cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH,320))
    		printf("Cant set width property\n");
    	if(cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240))
    		printf("Cant set height property\n");
     
    	// Threshold value
    	int thresh = 40;
     
    	// Create window object (use flag=0 to allow resize, 1 to auto fix size)
    	cvNamedWindow("Live video display", 1);
    	cvNamedWindow("Difference between subsequence image frames",1);
    	cvNamedWindow("Difference between subsequence image frames with threshold", 1);
    	cvCreateTrackbar("Threshold", "Difference between subsequence image frames with threshold", &thresh, 255, NULL);
     
    	// Call the function showCaptureProperties
    	showCaptureProperties(capture);
     
    	char key;                     // user input
    	int  EVENT_LOOP_DELAY = 40;	  // delay for GUI window
    	// 40 ms equates to 1000ms/25fps = 40ms per frame
     
    	int numberScenes = 1;
    	int idScene = 0;
    	int framePerSecond;
    	char filename[256];
    	CvVideoWriter* writer = NULL;
    	int frameId = 0;
     
    	if (argc > 2)
    		thresh = atoi(argv[2]);
     
    	printf(">>>> scene detection : %s\n",argv[1]);
     
    	for(;;)
    	{
    		// Capture the frame and load it in IplImage
    		frame = cvQueryFrame(capture);
    		if(!frame)
    			break;
     
    		frameId++;
     
    		// Create image header same as frame but with 1 channel to gray
    		if(!image)
    		{
    			image = cvCreateImage(cvSize(frame->width, frame->height), frame->depth,1);
    			image->origin = frame->origin;
    			threshImage = cvCreateImage(cvSize(frame->width, frame->height), frame->depth,1);
    			threshImage->origin = frame->origin;
    		}
     
    		// Convert frame to gray and store in image
    		cvCvtColor(frame, image, CV_BGR2GRAY);
     
    		// Create lastImage clone actual image
    		if(!lastImage)
    		{
    			lastImage = cvCloneImage(image);
    		}
     
    		// Create image header same as frame but with 1 channel to gray
    		if(!diffImage)
    		{
    			diffImage = cvCreateImage(cvSize(frame->width, frame->height), frame->depth,1);
    			diffImage->origin = frame->origin;
    		}
     
    		// Display movie in window
    		cvShowImage("Live video display", frame);
     
    		// Differences with actual and last image
    		cvAbsDiff(image, lastImage, diffImage);
    		cvShowImage("Difference between subsequence image frames", diffImage);
     
    		//Threshold image
    		cvThreshold(diffImage, threshImage, thresh, 255, CV_THRESH_BINARY);
    		cvShowImage("Difference between subsequence image frames with threshold", threshImage);
     
    		// Percentage of white pixels on the image 
    		int counterWhitePixels = 0;
    		int percentageWhitePixels = 0;
    		int numberPixels = threshImage->width*threshImage->height;
     
    		for(int i=0; i<threshImage->width; i++)
    		{
    			for(int j=0; j<threshImage->height; j++)
    			{
    				CvScalar pixel = cvGet2D(threshImage, j, i);
    				if(pixel.val[0] == 255)
    					counterWhitePixels++;
    			}
    		}
    		percentageWhitePixels = counterWhitePixels * 100 / numberPixels;
     
    		// detect movie scenes
    		if (percentageWhitePixels >  thresh)
    		{
    			numberScenes++;
    			cvReleaseVideoWriter(&writer);
    		}
     
    		// Split movie into scenes
    		framePerSecond = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
    		CvSize size = cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),
    							 (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
    		if (idScene != numberScenes)
    		{
    			idScene = numberScenes;
    			printf("Shot detected #%d at frame #%d\n",idScene,frameId);
    			sprintf(filename,"shot-%d.avi",idScene);
    			writer = cvCreateVideoWriter(filename, CV_FOURCC('M','J','P','G'), framePerSecond, size);
    			//writer = cvCreateVideoWriter(filename, -1, 25, cvSize(320,240));
     
    			printf("--- seq #%d frame id #%d threshold = %d \n",idScene,frameId,percentageWhitePixels);
    			printf("w=%d,h=%d\n",frame->width,frame->height);		
     
    			mjpegImage = cvCreateImage(size, IPL_DEPTH_8U, 3);
    			//mjpegImage = cvCloneImage(frame);
    			cvWriteFrame(writer, frame);
    		}	
     
    		// Change datas
    		lastImage = cvCloneImage(image);
     
    		// Start event processing loop (very important,in fact essential for GUI)
    		// 40 ms roughly equates to 1000ms/25fps = 4ms per frame
    		key = cvWaitKey(EVENT_LOOP_DELAY);
    		if (key == 'x')
    		{
    			// If user presses "x" then exit
    			printf("Keyboard exit requested : exiting now - bye!\n");	
    			break;
    		}
    	}
    	printf("<<<< scene detection : %s\n",argv[1]);
     
    	// Destroy capture object
    	cvReleaseVideoWriter(&writer);
     
    	// Destroy capture object
    	cvReleaseCapture(&capture);
     
    	// Destroys images created
    	cvReleaseImage(&frame);
    	cvReleaseImage(&image);
    	cvReleaseImage(&lastImage);
    	cvReleaseImage(&threshImage);
    	cvReleaseImage(&diffImage);
    	cvReleaseImage(&mjpegImage);
     
    	// Destroy window objects
    	cvDestroyAllWindows();
     
    	// All OK : main returns 0
    	return 0;
    }

  13. #13
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Pour repondre a yirmi je suis pas sur de comprendre ce qui t'arrive mais je suppose que tu ecris des videos et que quand t'essaye de les lire (avec VLC par exemple) ca marche pas. Ce probleme vient d'une histoire de codec avec opencv je crois, je ne vais pas me risquer a expliquer je m'y connais pas assez. Sinon pour voir si tes videos marchent cree toi un mini-programme pour les lire avec opencv, je pense que la ca devrait marcher.

  14. #14
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Par défaut
    En faites, le souci est qu'il me crée les fichiers vidéo. Mais quand je veux les lire, il me dit qu'il y a un problème de codec jpeg ou sinon il lit la video sans afficher les images (ça dépend des modifs que j'ai essayé de faire).

    Je ne vois pas où j'ai pu me planter... Avez vous une idée? Est-ce uniquement à cause du codec ou plutôt dû à une erreur dans le code.

    Je viens de tester via opencv. Et la aussi, il ne trouve pas les paramètres du codec pour une video de type : mjpeg, 320*240.

  15. #15
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    http://answers.oreilly.com/topic/136...e-with-opencv/

    Le codec est il bien installé sur ton pc ? (le codec n'est pas installé avec OpenCV il s'installe à part)

  16. #16
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Par défaut
    Le programme fonctionne sur mon PC. Donc les codecs sont OK. Reste à trouver la faille... Je me demande si je me suis pas mélanger les pinceaux avec "frame"...

  17. #17
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    il te manque le paramètre is_color et ton frame rate est un int au lieu d'être un double. Pas besoin de caster le cvGetCaptureProperty te renvoie directement un double.

  18. #18
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Par défaut
    Finalement, j'ai trouver la zone du problème. Cela n'a pas avoir avec le is_color et le fps (j'ai quand même effectué les modifs).

    J'ai toujours le même résultat... Mais cela provient de cvWriteFrame. Il n'écrit pas les frames sur le fichier en question. Dans l'exemple, on l'utilise dans une boucle while, or dans mon cas il copie l'image mais ne fait pas les shots et ne fait plus le traitement demandé... C'est à ne rien comprendre.

    Une idée?

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Citation Envoyé par snowpy Voir le message
    il faut mettre isColor à 1 pour encoder des frames couleur.
    Tu es sur que ca marche snowpy ? Je l'ai fait mais le même problème persiste.

    Edit: non c'est bon, c'est encore une autre faute de ma part, désolé

  20. #20
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    J'ai toujours le même résultat... Mais cela provient de cvWriteFrame. Il n'écrit pas les frames sur le fichier en question. Dans l'exemple, on l'utilise dans une boucle while, or dans mon cas il copie l'image mais ne fait pas les shots et ne fait plus le traitement demandé... C'est à ne rien comprendre.
    le cvwriter et le cvwrite sont dans la même boucle, il risque de pas apprécier la redéclaration. De ce que j'ai compris tu fais plusieurs frames qui elles même sont composé de plusieurs images, donc tu dois avoir deux boucles or la il n'y en a qu'une, tu as oublié (de visu à vérifier) la boucle de traitement des frames de la dite scène.

    ca correspond à quoi ?

    de visu tu incrémente jamais idscène donc tu va réécrire ta deuxième scène sur la première et ainsi de suite et vu qu'il doit écrire ca sous forme de bit à la fin ta un grand n'importe quoi ^^

    mais attention comme je l'ai dis au début à cvWriter qui ne doit pas être avec le cvwrite sauf si tu écris des vidéo de une frame ce qui n'est pas le cas. Déclare le avant ta boucle for et tu le rappelle juste après le release je pense que ca sera mieux et voir le souci des Id.

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( (bgr_frame=cvQueryFrame(capture)) != NULL )
    c'est quand même plus sexy non ?

Discussions similaires

  1. Problème de compilation d'un projet Qt avec OpenCV
    Par swito dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2011, 14h35
  2. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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