Précédent   Forum des professionnels en informatique > C et C++ > Bibliothèques > OpenCV
OpenCV Vos questions sur l'API de traitement d'images OpenCV.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 17h34   #1
Invité de passage
 
Inscription : mars 2010
Messages : 38
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 38
Points : 0
Points : 0
Par défaut detection 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 :
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;
}
nicodu43 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 08h39   #2
Membre confirmé
 
Inscription : décembre 2010
Messages : 99
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 99
Points : 203
Points : 203
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.
phi1981 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 13h36   #3
Membre Expert
 
Avatar de Joel F
 
Homme Joel Falcou
Chercheur en informatique
Inscription : septembre 2002
Messages : 824
Détails du profil
Informations personnelles :
Nom : Homme Joel Falcou
Âge : 32
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2002
Messages : 824
Points : 1 650
Points : 1 650
Envoyer un message via MSN à Joel F
on preferera l'algorithme sigma-delta qui a l'avantage de pas necessite de seuil arbitraire.
Joel F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 15h15   #4
Membre Expert
 
Jean-Bernard
Inscription : mars 2007
Messages : 817
Détails du profil
Informations personnelles :
Nom : Jean-Bernard
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2007
Messages : 817
Points : 1 251
Points : 1 251
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.
jblecanard est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h22.


 
 
 
 
Partenaires

Hébergement Web