Comment puis-je comparer deux images de l'appareil photo et savoir s'il y a suffisamment de différences pour détecter un mouvement?


18

Je souhaite utiliser mon téléphone comme système de vidéosurveillance pour contrôler une pièce de ma maison et afficher une alerte lorsque quelque chose bouge.

Pour l'instant, ce que j'ai réussi à faire, c'est de prendre une photo toutes les minutes et de la télécharger via un script PHP sur mon serveur. Maintenant, je voudrais comparer l'image actuelle et l'image il y a 1 minute et détecter si quelqu'un est entré dans la pièce. Donc, fondamentalement, je devrais comparer les différences de pixels sur l'image (mais aussi en tenant compte du fait qu'un nuage peut juste dire bonjour et changer la luminosité pendant une minute)

Quelqu'un at-il une idée sur la façon d'y parvenir ou un document à lire?


4
J'ai fait quelque chose comme ça il y a des années. Ma technique consistait à diviser l'image en sections, disons une grille 20 * 20, à trouver une valeur pour la couleur moyenne dans chaque cellule (en prenant la couleur moyenne dans chaque pixel de cette cellule) et à la stocker. Faites de même pour l'image suivante et s'il y a suffisamment (je vous laisse cette tolérance) de différence dans les couleurs moyennes, vous pouvez assumer le mouvement. Ne faites pas la tolérance si fine qu'elle remarquera des changements subtils dans la lumière ou des ombres qui passent, etc.

1
Voici un article intéressant sur le sujet que vous pouvez trouver utile codeproject.com/KB/audio-video/Motion_Detection.aspx

CHDK décompose également l'image en une grille. chdk.wikia.com/wiki/UBASIC/Scripts:_AdaptiveMD Pour détecter le mouvement et ne pas détecter les changements d'éclairage, je dirais qu'un changement dans beaucoup de cellules de la grille n'est pas un mouvement, alors qu'un changement dans seulement quelques cellules de la grille l'est.
endolith

Réponses:


10

Il me semble que ce que vous recherchez est une technique de soustraction d'arrière-plan. Avec des images bruyantes et des conditions d'éclairage changeantes, cela pourrait ne pas être trivial. La technique de pointe actuelle est la représentation matricielle de bas rang, mais elle nécessite non pas deux mais beaucoup (~ une douzaine) d'images. Voici quelques calculs intensifs: chaque image considérée comme un vecteur de pixels, des vecteurs combinés en matrice et cette matrice est décomposée en matrice de bas rang et en restes. Les colonnes matricielles de bas rang sont des arrière-plans et les restes sont des objets en mouvement. Il existe des implémentations open source, mais uniquement pour la factorisation elle-même, pas un pipeline d'images complet IIRC

Voici un article et un code pour la factorisation matricielle http://www.ece.rice.edu/~aew2/sparcs.html

Voici un aperçu du blog CS et un lien vers un autre code:

https://sites.google.com/site/igorcarron2/matrixfactorizations

http://nuit-blanche.blogspot.com/search/label/MF

Aperçu de quelques autres techniques: http://www.vis.uni-stuttgart.de/uploads/tx_vispublications/Brutzer2011-2.pdf


1
avez-vous intentionnellement fait cette CW?
Lorem Ipsum,

1
Que signifie "CW"?
mirror2image

Ahh, question wiki. J'ai pensé que ce serait une bonne idée d'introduire ce tout nouveau ppl techto faisant des choses pratiques. N'hésitez pas à le retirer si vous n'êtes pas d'accord. De plus, d'autres personnes peuvent avoir plus d'expérience avec cette technologie - j'ai seulement commencé à y aller.
mirror2image

Un CW est une question communautaire-Wiki. Cela signifie que vous n'obtiendrez pas de réputation (dans ce cas 4x10 = 40) pour les votes positifs sur votre réponse. Certaines personnes font intentionnellement leurs réponses comme ça, mais le plus souvent, c'est accidentel. Je suis revenu sur cela pour que vous obteniez votre représentant. Il est maintenant 181 de 126 :)
Lorem Ipsum

5

N'oubliez pas: il y a des ombres (pas seulement la luminosité).

Je n'aime pas vraiment l'idée de James Webster, car elle consiste essentiellement à réduire la résolution dans chaque dimension et à comparer les images réduites (je n'aime pas non plus les seuils - ils sont arbitraires, vous devez les tester et les ajuster) jusqu'à ce que vous obteniez une bonne valeur et le lendemain, ces valeurs pourraient être obsolètes en raison de conditions météorologiques différentes ou d'autres effets environnementaux)

Mais pour être juste, je n'ai pas non plus de très bonne solution. Ma première idée a été de comparer chaque image à une image de référence de la pièce vide et d'exécuter une détection de bord sur l'image diff. Mais cela détecterait également les ombres. Mais je suppose que vous ne pouvez pas faire de différence entre les ombres et les autres objets ... au moins, je ne sais pas comment. Mais vous pouvez peut-être comparer le résultat après la détection de bord entre 2 images, car les ombres se déplacent généralement lentement (il y aura toujours des problèmes lorsque les voitures se déplaceront ou lorsqu'un nuage se déplacera)


Vous voulez détecter quelque chose qui change soudainement. Les ombres ne changeront pas beaucoup d'une minute à l'autre. La luminosité globale du soleil le sera cependant.
endolith

2
Les ombres se déplaceront rapidement, s'il y a par exemple une voiture qui passe et qui laisse tomber sa propre ombre à travers la fenêtre ou qui laisse tomber les ombres d'autres objets par son phare.
Philipp Wendt

4

La technique de «factorisation matricielle» ne vous aidera PAS à faire votre travail! Le document référencé par @ mirror2image concerne la soustraction d'arrière-plan mais PAS basé sur la "factorisation matricielle".

L'utilisation de la vidéo en cours d'exécution pour détecter des objets en mouvement (humains ou véhicules) est un domaine de recherche actif.

En tant que principe de base, le système estime un arrière-plan statique typique en échantillonnant plusieurs images et prend une différence d'énergie entre l'image entrante et l'arrière-plan. Si l'énergie est importante, le pixel est classé au premier plan. Un tel ensemble de premier plan vous indique s'il existe une entrée de l'objet dans le système.

La meilleure référence à votre document de recherche (et également relativement plus simple si vous voulez vraiment l'implémenter) serait - W4 System le trouver ici et voir le document de Picardi ici comme une enquête plus détaillée pour d'autres techniques du système.

Il existe de nombreux défis qui s'appliquent au problème:

  1. La présence de bruit crée des problèmes d'ambiguïté majeure. L'approche ici consiste à appliquer un filtrage temporel efficace et à considérer la variance du bruit pour le rendre insensible au seuil.

  2. La présence de l'ombre crée l'ambiguïté de ne pas être un premier plan ni. Il existe des articles qui modélisent la distinction couleur / intensité pour distinguer l'ombre du réel au premier plan.

  3. Le fond peut être complexe comme agiter des arbres ou de la mer, etc.

  4. L'arrière-plan peut avoir une variation d'éclairage lente ou soudaine où un arrière-plan "appris" antérieur est ensuite adapté au nouveau.

L'un des papiers de référence les plus référencés, appelé algorithme de fleur de mur, montre la meilleure façon de combiner divers scénarios de ce type pour produire une détection robuste d'objets en mouvement.


2

Je ne connais pas la solution exacte, mais vous devriez faire une sorte de hachage de l'image; un ensemble de données plus petit extrait de l'image, qui est mieux comparable que l'image entière.

Je pense que l' histogramme des couleurs est un bon choix pour cela.

Si vous divisez votre image en zones et créez des histogrammes séparés pour ces zones, vous pouvez déterminer la position / le chemin de l'intrus.


Merci beaucoup, j'attendrai d'autres solutions, si je ne trouve pas mieux, j'accepterai la vôtre. Pour info, je ne veux pas déterminer le chemin de l'intrus, car 1 minute ne suffit pas pour cela, mais simplement envoyer une alerte est super. Merci.

1
Attention, certains intrus pourraient finir en 1 minute! Faites des vérifications aussi fréquentes que possible. Si votre programme est trop lent, diminuez la résolution de l'image.

1
Oui, en fait, je prévois de prendre une photo toutes les 10 secondes, et de les télécharger uniquement lorsque je détecte un intrus, ou chaque minute en l'absence de problème.

1

Prendre la différence deux fois, c'est-à-dire que la différence des différences peut aider .. donc si la dérivée double des pixels est supérieure à un seuil dans certaines régions, vous pouvez donc l'appeler comme quelqu'un est entré dans la pièce. Un changement de luminosité donnera un gradient approximativement constant dans toute l'image, mais la prise de la dérive de Hesse ou double donnera une bonne indication du mouvement ou des changements majeurs dans la pièce.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.