soustraction de fond opencv
bonsoir tous le monde :)
j'ai suivi l'algorithme suivant pour la détection de premier plan
Dn(x,y) = 0 si Sn(x,y)<= Th
Dn(x,y) = 1 sinon
Sn(x,y)= abs( In(x,y) - Bn(x,y))
et Th= MED + 3* 1.4826* MAD avec MED = median(Sn(x,y)) et MAD=median(Sn(x,y)-MED)
1- j'aimerais bien vérifier si la valeur de seuil est déterminé comme suivant:
emm forte probabilité que mon implementation est fausse puisque le type de retour de th est une matrice et il faut que th soit une valeur (double) pour appliquer la fonction threshold alors quelle est la fonction utilisé pour calculer MED et MAD??. pour plus d'information MED est le parametre median qui correspond à la valeur typique de bruit.
Code:
1 2 3 4
| Mat MED, MAD;
medianBlur(fg_mask, MED, 3);
medianBlur((fg_mask-MED), MAD,3);
Mat th=MED+ 3* 1.4826*MAD; |
2- j'ai fait cet algorithme comme une fonction qui dépend de deux entrées et retourne une image (Mat)
Code:
Mat foreground(Mat background, Mat current)
alors dans la fonction main () j'ai fait un appel de cette fonction, le code est comme suivant ici j'aimerais verifier aussi si les instructions sont justes ou pas avec In(x,y) et Bn(x,y) correspond a un instant n (emmm j'initialise le background par la premiere frame puis je bloque: background sera inchangé). comment peux je resoudre ca?
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
| int main()
{
Mat background, frame1;
VideoCapture capture;
while(1)
{
//while permet le rouvrant la capture à chaque fois la vidéo atteint sa dernière image
capture.open("C:/Users/sbi/Documents/Visual Studio 2010/Projects/FireDetection/clips/9.avi");
if (!capture.isOpened())
{
cout <<"ERROR\n";
}
capture.read(background);
//vérifier si la video atteint la derniere image
//nous ajoutons -1 parce que nous lisons deux cadres de la vidéo à la fois
//si cela ne est pas inclus, nous obtenons une erreur de mémoire
while(capture.get(CV_CAP_PROP_POS_FRAMES)<capture.get(CV_CAP_PROP_FRAME_COUNT)-1)
{
//lecture du premiere image
capture.read(frame1);
foreground(background, frame1);
imshow ("Frame1", frame1);
}
capture.release();
}
return 0;
} |
merci pour vos aide :)