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 :

Détection de fond avec openCv


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut Détection de fond avec openCv
    Bonjour je suis actuellement en train de développer une application de réalité augmentée. Pour ce faire j'utilise la bibliothèque openCV, seulement voilà ma démarche est dans un premier temps de détecter le fond puis de comparer le fond avec l'image renvoyer par ma webcam (simple) mais à chaque tour de boucle le fond se remet à jour alors qu'il ne devrait pas donc forcément les deux image sont identique.
    en clair est-ce que quelqu'un pourrait me dire pourquoi ce satané fond se remet a jour.
    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
    #include <iostream>
    #include <opencv2\opencv.hpp>
     
    using namespace std;
    using namespace cv;
     
    #define PI 3,14159265
     
    int main(int argc, char** argv)
    {
    	//déclaration de plusieurs variables utiles
    		//la capture vidéo
    	VideoCapture cap;
    	cap.open(0);
    	char key = 'a';
    		//les images
    	Mat image;
    	Mat fond;
    	Mat diff;
    		//les fenêtres
    	namedWindow("Projet - image",CV_WINDOW_AUTOSIZE);
    	namedWindow("Projet - fond",CV_WINDOW_AUTOSIZE);
    	namedWindow("Projet - travail",CV_WINDOW_AUTOSIZE);
     
    	//boucle pour permettre la mise au point de l'objectif
    	for(int i=0; i<10; i++)
    		cap >> fond;
    	flip(fond,fond,1);
     
    	while(key != 'Q' && key != 'q' && key != 27)
    	{
    		//on prend l'image de la webcam
    		cap >> image;
    		flip(image,image,1);
     
    		//on compare les deux images
    		compare(fond,image,diff,CMP_NE);
     
    		//affichage
    		imshow("Projet - image",image);
    		imshow("Projet - travail",diff);
    		imshow("Projet - fond",fond);
     
    		//tempo
    		key = waitKey(10);
    	}
     
    	return 0;
    }

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Deux images capturées par une caméra ne sont jamais identiques, même si rien n'a bougé. Tu as toujours un "bruit" qui vient perturber ton signal.
    Du coup, simplement en comparant deux pixels, surtout si tu travailles dans une haute résolution (genre 352x288), tu obtiendras toujours des différences.
    Il vaut donc mieux utiliser une fonction absdiff qui va te retourner les différences pixel à pixel puis ensuite passer l'image résultante à travers un seuil (donc via compare CMP_GE cette fois) pour savoir "à quel point tel pixel a vraiment changé".
    Evidemment, toute la subtilité c'est de savoir quel seuil avoir. L'idéal (assez complexe) c'est de mesurer le bruit que tu as lorsque rien ne bouge (une sorte d'apprentissage de la scène), et donc là tu auras une idée du seuil que tu devrais appliquer.
    Plus complexe : tu peux aussi appliquer un filtre passe-bas (genre une mediane d'un groupe de pixels) pour éliminer les impuretés.
    Aussi, travailler dans une plus basse résolution aide beaucoup.

    Edit : Oh et pour tes expériences, je te conseille TRES VIVEMENT de travailler avec une video enregistrée, et pas directement avec ta caméra, parce que sinon tu n'obtiens aucune expérience répétable.

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    on preferera l'algorithme sigma-delta qui a l'avantage de pas necessite de seuil arbitraire.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Bonjour

    Je sais de quoi ça vient et ça n'a aucun rapport avec le choix de l'algorithme, c'est une subtilité dans la version C++ d'OpenCV qu'il faut connaître, et j'avais eu le même problème.

    En fait, lorsque tu écrit :
    cap écrit l'image de la webcam dans une matrice puis donne une poignée sur cette matrice à fond (poignée, pointeur, peu importe, fond se met à pointer une autre zone mémoire). Si tu appelles ensuite :

    Cette matrice n'est pas réallouée et par conséquent image et fond sont strictement identiques puisque les données pointées sont communes. Tu peux essayer : modifie image à la main via n'importe quoi et observe fond, c'est la même image.

    Pour que ça fonctionne, il faut que tu forces la duplication des données pour fond avant de commencer ton traitement (il doit y avoir une méthode clone ou copy, regarde dans la doc, c'est expliqué). Tout cela est valable aussi lorsque tu assignes une matrice à une autre : il n'y a pas de copie, seulement un transfert de pointeurs.

Discussions similaires

  1. Détection de forme et de couleur
    Par neuromencien dans le forum OpenCV
    Réponses: 3
    Dernier message: 27/06/2015, 17h36
  2. Détection des points d'intérêts avec OpenCV
    Par daoudasylla dans le forum Bibliothèques, systèmes et outils
    Réponses: 2
    Dernier message: 17/04/2015, 20h17
  3. détection JVM installé avec script php/javascript
    Par <DYDY> dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2006, 14h42
  4. Réponses: 1
    Dernier message: 06/12/2005, 22h23

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