|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mars 2010 Messages : 38 ![]() |
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é Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Inscription : décembre 2010 Messages : 99 ![]() |
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. |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() ![]() |
on preferera l'algorithme sigma-delta qui a l'avantage de pas necessite de seuil arbitraire.
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Jean-Bernard Inscription : mars 2007 Messages : 817 ![]() |
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. |
|
|
30
|
Copyright © 2000-2012 - www.developpez.com