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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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