soustraction d'arrière-plan efficace avec OpenCV
-
19-09-2019 - |
Question
Je veux faire la soustraction d'arrière-plan dans un fichier vidéo en utilisant la méthode OpenCV. En ce moment, je suis capable de faire la soustraction d'arrière-plan, mais le problème est que je ne pouvais pas obtenir la sortie en mode couleur. Toute la sortie après soustraction de l'arrière-plan vient en mode couleur en niveaux de gris :. ( Je veux obtenir les informations de couleur au premier plan qui est la sortie résultante après fond obtenu soustrait
.Puis-je le faire en utilisant la technique de masquage ?? comme la procédure suivante que je pense à.
- Capture d'entrée -
InputFrame
(RGB) - Processus
InputFrame
- Soustraire fond, premier plan de magasin dans
TempFrame
(qui vient en niveaux de gris : () - Créer un
TempFrame
à l'aide du masque - Appliquer le masque créé à l'
InputFrame
- Obtenir au premier plan de couleur comme
OutFrame
Je suis frappé avec faire le masquage en utilisant OpenCV. Je suis juste un très débutant dans OpenCV. S'il vous plaît aidez-moi à surmonter cela.
Merci d'avance.
La solution
D'accord, je ne comprends pas comment TempFrame (votre premier plan) pourrait être si vous Niveaux de gris utilisez la soustraction d'arrière-plan. Vous devez utiliser un algorithme très spécial. Mais en supposant TempFrame est gris, alors vous feriez ceci:
cv::Mat mask = tempFrame > 0.5;
cv::Mat outFrame;
capturedFrame.copyTo(outFrame, mask);
C'est le code OpenCV 2.0 ci-dessus. Le nombre 0,5 est un seuil, vous devrez le mettre quelque chose appropriée. Si vous n'êtes pas d'utiliser des images à virgule flottante, vous auriez probablement mettre à 128 ou quelque chose comme ça. Ceci est la même chose dans OpenCV 1.1 Code:
CvMat* mask = cvCreateMat(tempFrame.rows, tempFrame.cols, CV_8UC1);
cvCmpS(tempFrame, 0.5, mask);
CvMat* outFrame = cvCreateMat(capturedFrame.rows, capturedFrames.cols, CV_32FC3);
cvCopy(capturedFrame, outFrame, mask);
Autres conseils
code est ici
pour atteindre un premier plan de couleur il suffit de copier l'image à l'aide d'un masque avant-plan
// image.copyTo (au premier plan, au premier plan);