CV - Extraire les différences entre deux images

Je suis actuellement en train de travailler sur un système anti-intrusion basé sur la vidéo de surveillance. Afin d'accomplir cette tâche, je prendre un instantané de l'arrière-plan de ma scène (supposons qu'elle est totalement propre, pas de personnes ou d'objets en mouvement). Ensuite, je compare l'image que je reçois de l' (statique) de la caméra vidéo et de chercher les différences. Je dois être en mesure de vérifier tout différences, non seulement la forme humaine, ou que ce soit, donc je ne peux pas spécifique à l'extraction des caractéristiques.

Généralement, j'ai:

CV - Extraire les différences entre deux images

Je suis en utilisant OpenCV, afin de comparer en gros, je fais:

cv::Mat bg_frame;
cv::Mat cam_frame;
cv::Mat motion;

cv::absdiff(bg_frame, cam_frame, motion);
cv::threshold(motion, motion, 80, 255, cv::THRESH_BINARY);
cv::erode(motion, motion, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)));

Voici le résultat:

CV - Extraire les différences entre deux images

Comme vous pouvez le voir, le bras dénudé (en raison de la couleur de différentiel de conflit, je suppose) et ce n'est malheureusement pas ce que je veux.

J'ai pensé à ajouter l'utilisation de cv::Canny() afin de détecter les bords et remplir la partie manquante du bras, mais malheureusement (encore une fois), elle ne résout le problème en quelques pas de la plupart d'entre eux.

Est-il un algorithme ou une technique que je pourrais utiliser pour obtenir un précis différence de rapport?

PS: Désolé pour les images. En raison de mon nouvel abonnement, je n'ai pas assez de réputation.

MODIFIER
J'utilise des niveaux de gris de l'image ici, mais je suis ouvert à toute solution.

  • peut-être essayer de ne pas réinventer la roue
  • juste un coup d'oeil, ce qui est déjà intégrée (et si ça fonctionne mieux), oui.
  • avez-vous convertir en niveaux de gris? Si vous ne voulez pas utiliser le openCV classes: Essayez le calcul de la différence de chaque canal et de les combiner, essayez de différence de HSV images. Si vous souhaitez utiliser les techniques existantes, essayez de ViBe. Gardez à l'esprit que même les variations de l'éclairage sera "les différences, non seulement la forme humaine, ou que ce soit", ce qui pourrait être un problème pour la plupart de toutes les méthodes de soustraction d'arrière-plan.
  • en général, la construction d'un modèle d'arrière-plan au fil du temps, à l'aide de nombreuses images, va battre tous les approche. aussi, Vibe <-- juste être conscient qu'il est breveté.
  • eh bien, la question ici est de ne pas construire le modèle d'arrière-plan, mais de trouver les "différences" mieux (ce qui est difficile dans les images en niveaux de gris). @ValentinTrinqué pouvez-vous s'il vous plaît ajouter de l'origine unique des images, j'ai mis en place une stratégie multi-canal de la version de votre code, mais je n'ai pas accès aux images d'origine. Essayé de recadrer votre double image, mais ils ont l'air un peu traduits...