IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Soustraction de l'arrière-plan


Sujet :

OpenCV

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Soustraction de l'arrière-plan
    bjr
    je cherche a implémenter une méthode de soustraction de l'arrière plan basé sur la différence entre les pixel intitulé "adaptif background with persistent pixels" à l'aide de la bibliothéque openCv. j'espére qu'il y a quelqu'un qui peut m'aider. merci d'avance

  2. #2
    Membre régulier Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 88
    Points
    88
    Par défaut Samples
    Bonjour,
    Un exemple est disponible sur l’implémentation d'une extraction de fond basé sur la methode utilisant des mixtures de gaussiens.
    https://code.ros.org/svn/opencv/bran.../bgfg_segm.cpp

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    merci pour le code mais c pas exactement ce que je cherche. La méthode que je cherche consiste à faire des comparaisons des intensités de chaque pixel de l'image sur un nombre n d'images de la vidéo et selon la variation de l'intensité comparé avec un seuil on prend la décision sur ce pixel s'il appartient au background ou au foreground. j'espère que vous pouvez m'aider.

  4. #4
    Membre régulier Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 88
    Points
    88
    Par défaut
    Du coup je pense que la solution énoncée plus haut devrait te convenir:
    Considérons Ir et Ic respectivement ton image de reference et ton image courante et T la valeur de ton seuil. Le code sera alors (en C++) le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Threshold(abs(Ir-Ic), BGmask, T, 255, THRESH_BINARY_INV);
    BGmask sera alors une Matrice representant le masque de ton fond (255 si le pixel fait partie du fond, 0 sinon)

    Je te conseille tout de même d'essayer la précédente méthode qui donne de super résultat.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    maintenant si je veut éliminer l'ombre du foreground pouvez vous me proposer une méthode performante? merci

  6. #6
    Membre régulier Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 88
    Points
    88
    Par défaut
    sachant que l'ombre comporte des ressemblances avec ton background tu peux essayer dans un premier temps de jouer avec ton seuil.
    tu peux également faire la comparaison précédente sur plusieurs composantes et même essayer différents espaces de couleurs.
    Je n'ai pas encore travailler sur le sujet mais tiens nous au courant

  7. #7
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Points : 15
    Points
    15
    Par défaut petit bout de code...
    kikou!
    je vous passe mon main de prog de detection par soustraction de fond.
    il y à quelques bugs mais bon ;p j'ai essayé d'utiliser le moins possible les fonctions toutes prêtes de opencv histoire de comprendre un peu plus les choses...
    à toute!


    <code>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #include <mmsystem.h>

    #include "highgui.h"
    #include "cv.h"

    //#include <opencv2/core/core.hpp>
    //#include <opencv2/highgui/highgui.hpp>
    //using namespace cv;


    int main() {

    // Touche clavier
    char key;
    // Image
    IplImage *image;
    // Capture vidéo
    CvCapture *capture;






    #define LARGEUR_VIDEO 640
    #define HAUTEUR_VIDEO 480

    //#define objects_detect
    #define light_adapt_objects_detect


    // Ouvrir le flux vidéo
    //capture = cvCreateFileCapture("/path/to/your/video/test.avi"); // chemin pour un fichier
    capture = cvCreateCameraCapture(1);

    // Vérifier si l'ouverture du flux est ok
    if (!capture) {

    printf("Ouverture du flux vidéo impossible !\n");
    return 1;

    }else{printf("flux video ok!");}

    // Définition de la fenêtre
    cvNamedWindow("Cam Window", CV_WINDOW_AUTOSIZE);
    //Sleep(10000);
    uchar *p;

    // Boucle tant que l'utilisateur n'appuie pas sur la touche q (ou Q)
    while(key != 'q' && key != 'Q')
    {
    static unsigned char oldbuzz;
    unsigned char buzztemp=oldbuzz;//???sinon oldbuzz n'est pas pris en compte comme variable globale???
    unsigned char buzz=0;
    //printf("\nAoldbuzz");
    buzz=0;

    // On récupère une image
    image = cvQueryFrame(capture);

    p=(uchar*)image->imageData;

    assert (image->depth == IPL_DEPTH_8U && image->nChannels ==3);

    /*
    for (line = (uchar*) image->imageData;
    line < (uchar*) image->imageData + image->imageSize;
    line += image->widthStep)
    {

    for (p = line; p < line + image->width*3; ++p)
    {
    *p = 255 - *p;
    }
    }
    */



    #ifdef objects_detect
    static unsigned char go=0;

    #define coefseuil 30
    #define nbr_surfaces_max 100
    #define object_surfacepx_min 100

    static unsigned char buffer[LARGEUR_VIDEO*HAUTEUR_VIDEO*3]={0};

    unsigned int old_line[LARGEUR_VIDEO*3]={0};


    unsigned int surfacespresentes[nbr_surfaces_max]={0};
    unsigned int oldsurfacespresentes[nbr_surfaces_max]={0};

    unsigned int Ssurfaces[nbr_surfaces_max];
    unsigned int Sxmin[nbr_surfaces_max];
    unsigned int Sxmax[nbr_surfaces_max];
    unsigned int Symin[nbr_surfaces_max];
    unsigned int Symax[nbr_surfaces_max];
    unsigned int Ssurfacepx[nbr_surfaces_max];








    if(key!='o'||key!='O') //si touche "o" pushed
    {

    if(go<10) //enregistrer image de fond et inittialisation de toutes les variables
    {

    for(unsigned int x=0;x<(LARGEUR_VIDEO*HAUTEUR_VIDEO*3);x+=1)
    {buffer[x]=p[x];}


    for(unsigned int i_init=0;i_init<nbr_surfaces_max;i_init++)
    {
    Ssurfaces[i_init]=0;
    Sxmin[i_init]=LARGEUR_VIDEO*3;
    Sxmax[i_init]=0;
    Symin[i_init]=HAUTEUR_VIDEO;
    Symax[i_init]=0;
    Ssurfacepx[i_init]=0;
    }

    for(unsigned int x=0;x<LARGEUR_VIDEO*3;x+=1)
    {old_line[x]=0;}

    go++;
    }
    else
    {







    unsigned char status=0;
    unsigned int oldpixel=0;
    unsigned int index=0;
    unsigned int indexy=0;
    unsigned int iboucle=0;
    unsigned int xstart=0;
    unsigned int xend=0;

    for(unsigned int y=0;y<=HAUTEUR_VIDEO;y++)
    {indexy = y*LARGEUR_VIDEO*3; status=0;for(unsigned int izero=0;izero<nbr_surfaces_max;izero++){oldsurfacespresentes[izero]=surfacespresentes[izero];surfacespresentes[izero]=0;}

    for(unsigned int x=0;x<LARGEUR_VIDEO*3;x+=3)
    {index=indexy+x;
    //status:0=null, 1=debutzoneinconnue 2=zoneconnue
    if(status==0)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    {//p[index]=255;p[index+1]=255;p[index+2]=255;
    if(old_line[x]!=0){xstart=x;oldpixel=old_line[x];Ssurfacepx[old_line[x]]++;surfacespresentes[old_line[x]]=1; /*Symin[old_line[x]]=y;*//*Symax[old_line[x]]=y;*/if(Sxmax[old_line[x]]<x){Sxmax[old_line[x]]=x;} if(Sxmin[old_line[x]]>x){Sxmin[old_line[x]]=x;}status=2;oldpixel=old_line[x];}else{status=1;xstart=x;}

    }
    else{old_line[x]=0;}
    }

    else if(status==1)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    {//p[index]=255;p[index+1]=255;p[index+2]=255;

    if(old_line[x]!=0){for(unsigned int ioldline=xstart;ioldline<=x;ioldline+=3){old_line[ioldline]=old_line[x];}status=2;surfacespresentes[old_line[x]]=1;oldpixel=old_line[x];/*old_line[x]=0;*/}

    }else{iboucle=1;while((iboucle<nbr_surfaces_max)&&(Ssurfaces[iboucle]==1)){iboucle++;}Ssurfaces[iboucle]=1;Sxmin[iboucle]=xstart;Sxmax[iboucle]=x;Symin[iboucle]=y;Symax[iboucle]=y;Ssurfacepx[iboucle]=((x-xstart)/3);surfacespresentes[iboucle]=1;for(unsigned int i=xstart;i<x;i+=3){old_line[i]=iboucle;}old_line[x]=0;oldpixel=0;status=0;}
    }

    else if(status==2)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    { //p[index]=255;p[index+1]=255;p[index+2]=255;
    if(old_line[x]==0){old_line[x]=oldpixel; }
    else{
    if(oldpixel!=old_line[x]){Ssurfacepx[oldpixel]+=Ssurfacepx[old_line[x]];Ssurfacepx[old_line[x]]=0; if(Sxmin[oldpixel]>Sxmin[old_line[x]]){Sxmin[oldpixel]=Sxmin[old_line[x]];} if(Sxmax[oldpixel]<Sxmax[old_line[x]]){Sxmax[oldpixel]=Sxmax[old_line[x]];} if(Symin[oldpixel]>Symin[old_line[x]]){Symin[oldpixel]=Symin[old_line[x]];}Symax[oldpixel]=y;Sxmin[old_line[x]]=LARGEUR_VIDEO*3;Sxmax[old_line[x]]=0;Symin[old_line[x]]=HAUTEUR_VIDEO;Symax[old_line[x]]=0; surfacespresentes[old_line[x]]=0;surfacespresentes[oldpixel]=1;unsigned int tempvar=old_line[x];Ssurfaces[oldpixel]=1;Ssurfaces[old_line[x]]=1; for(unsigned int i=0;i<LARGEUR_VIDEO*3;i+=3){if(old_line[i]==tempvar){old_line[i]=oldpixel;}} }
    }


    }else{if(Sxmin[oldpixel]>xstart){Sxmin[oldpixel]=xstart;} if(Sxmax[oldpixel]<x){Sxmax[oldpixel]=x;}Symax[oldpixel]=y;Ssurfacepx[oldpixel]+=((x-xstart)/3);old_line[x]=0;status=0;oldpixel=0;surfacespresentes[oldpixel]=1;}
    }

    //buffer[index]=p[index];
    //buffer[index+1]=p[index+1];
    //buffer[index+2]=p[index+2];

    }//fin ligne x

    if(status==1){iboucle=1;while((iboucle<nbr_surfaces_max)&&(Ssurfaces[iboucle]==1)){iboucle++;}Ssurfaces[iboucle]=1;Sxmin[iboucle]=xstart;Sxmax[iboucle]=LARGEUR_VIDEO*3;Symin[iboucle]=y;Symax[iboucle]=y;Ssurfacepx[iboucle]=((LARGEUR_VIDEO-xstart)/3);surfacespresentes[iboucle]=1;for(unsigned int i=xstart;i<LARGEUR_VIDEO*3;i+=3){old_line[i]=iboucle;}old_line[LARGEUR_VIDEO*3-3]=0;oldpixel=0;status=0;}
    if(status==2){Ssurfaces[oldpixel]=1; surfacespresentes[oldpixel]=1; if(Sxmin[oldpixel]>xstart){Sxmin[oldpixel]=xstart;} if(Sxmax[oldpixel]<LARGEUR_VIDEO*3){Sxmax[oldpixel]=LARGEUR_VIDEO*3;}Symax[oldpixel]=y;Ssurfacepx[oldpixel]+=(((LARGEUR_VIDEO*3)-xstart)/3);old_line[LARGEUR_VIDEO*3-3]=0;status=0;oldpixel=0;}

    //si une surface disparait, crééer objet
    for(unsigned int i=0;i<nbr_surfaces_max;i++)
    {
    //printf("\nold:%ld new:%ld",oldsurfacespresentes[i],surfacespresentes[i]);
    if(/*(oldsurfacespresentes[i]==1)&&*/surfacespresentes[i]==0)
    {

    //if(Ssurfacepx[i]>object_surfacepx_min&&Ssurfacepx[i]<500000000&&((((Sxmax[i]-Sxmin[i])/3)/(Symax[i]-Symin[i]))<5)&&(((Symax[i]-Symin[i])/((Sxmax[i]-Sxmin[i])/3))<5) )
    if(Ssurfacepx[i]>object_surfacepx_min && Ssurfacepx[i]<500000000 )//&& ((Sxmax[i]-Sxmin[i])/3)>20 && (Symax[i]-Symin[i])>20 )
    {

    unsigned int pox=(Sxmin[i]/3)+((Sxmax[i]/3)-(Sxmin[i]/3))/2;
    unsigned int poy=(Symin[i])+((Symax[i])-(Symin[i]))/2;
    //if(pox<25){pox=25;}
    //if(poy<25){poy=25;}
    //if(pox>LARGEUR_VIDEO-25){pox=LARGEUR_VIDEO-25;}
    // if(poy>HAUTEUR_VIDEO){poy=HAUTEUR_VIDEO-25;}
    printf("\ni:%ld xmin:%ld xmax:%ld ymin:%ld ymax:%ld s:%ld",i,(Sxmin[i]/3),(Sxmax[i]/3),Symin[i],Symax[i],Ssurfacepx[i]);
    //green_rect_big(pox-12,poy+12,p);
    // green_rect_big(pox,poy,p);



    for(unsigned int draw=0;draw<Sxmax[i]-3-Sxmin[i];draw+=3)//horizontal croix
    {
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw]=0;
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw+1]=0;
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw+2]=255;
    }

    for(unsigned int draw=0;draw<Symax[i]-Symin[i];draw+=1)//vertical croix
    {
    p[(Sxmin[i]+((Sxmax[i]/3-Sxmin[i]/3)/2)*3)+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=0;
    p[(Sxmin[i]+((Sxmax[i]/3-Sxmin[i]/3)/2)*3)+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=0;
    p[(Sxmin[i]+((Sxmax[i]/3-Sxmin[i]/3)/2)*3)+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=255;
    }







    #define B 0
    #define G 255
    #define R 0
    for(unsigned int draw=0;draw<Sxmax[i]-3-Sxmin[i];draw+=3)//horizontal carre
    {
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw]=B;
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw+1]=G;
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw+2]=R;

    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw]=B;
    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw+1]=G;
    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw+2]=R;

    }

    for(unsigned int draw=0;draw<=Symax[i]-Symin[i];draw+=1)//vertical carre
    {
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=B;
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=G;
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=R;

    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=B;
    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=G;
    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=R;

    }




    CvPoint origine;
    origine.x=Sxmin[i]/3;
    origine.y=Symin[i];
    unsigned char numerobox[10]={0};

    CvFont * font = new CvFont;
    cvInitFont(font, CV_FONT_VECTOR0, 0.5f, 1.0f, 0, 1, 8); //rate of width and height is 1:2
    char szText[4];
    sprintf(szText, "%ld",i); //make string
    //cvPutText(image, szText, origine, font, CV_RGB(255, 255, 255)); //draw text on the IplImage* (Image)









    //p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)]=255;p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)]=255;p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)]=255;p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)]=255;p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)+2]=255;





    }
    Ssurfaces[i]=0;
    Sxmin[i]=LARGEUR_VIDEO*3;
    Sxmax[i]=0;
    Symin[i]=HAUTEUR_VIDEO;
    Symax[i]=0;
    Ssurfacepx[i]=0;

    }


    //oldsurfacespresentes[i]=surfacespresentes[i];surfacespresentes[i]=0;
    }




    }

    }





    }else {go=0;}
    #endif


















































    #ifdef light_adapt_objects_detect
    static char go=0;

    #define coefseuil 20
    #define nbr_surfaces_max 100
    #define object_surfacepx_min 100

    static unsigned char buffer[LARGEUR_VIDEO*HAUTEUR_VIDEO*3]={0};

    unsigned int old_line[LARGEUR_VIDEO*3]={0};


    unsigned int surfacespresentes[nbr_surfaces_max]={0};
    unsigned int oldsurfacespresentes[nbr_surfaces_max]={0};

    unsigned int Ssurfaces[nbr_surfaces_max];
    unsigned int Sxmin[nbr_surfaces_max];
    unsigned int Sxmax[nbr_surfaces_max];
    unsigned int Symin[nbr_surfaces_max];
    unsigned int Symax[nbr_surfaces_max];
    unsigned int Ssurfacepx[nbr_surfaces_max];



    if(go==0) //enregistrer image de fond et inittialisation de toutes les variables
    {

    for(unsigned int x=0;x<(LARGEUR_VIDEO*HAUTEUR_VIDEO*3);x+=1)
    {buffer[x]=p[x];}


    for(unsigned int i_init=0;i_init<nbr_surfaces_max;i_init++)
    {
    Ssurfaces[i_init]=0;
    Sxmin[i_init]=LARGEUR_VIDEO*3;
    Sxmax[i_init]=0;
    Symin[i_init]=HAUTEUR_VIDEO;
    Symax[i_init]=0;
    Ssurfacepx[i_init]=0;
    }

    for(unsigned int x=0;x<HAUTEUR_VIDEO*3;x+=1)
    {old_line[x]=0;}

    go++;
    }
    else
    {









    unsigned char status=0;
    unsigned int oldpixel=0;
    unsigned int index=0;
    unsigned int indexy=0;
    unsigned int iboucle=0;
    unsigned int xstart=0;
    unsigned int xend=0;


    for(unsigned int y=0;y<=HAUTEUR_VIDEO;y++)
    {indexy = y*LARGEUR_VIDEO*3; status=0;for(unsigned int izero=0;izero<nbr_surfaces_max;izero++){oldsurfacespresentes[izero]=surfacespresentes[izero];surfacespresentes[izero]=0;}

    for(unsigned int x=0;x<LARGEUR_VIDEO*3;x+=3)
    {index=indexy+x;
    //status:0=null, 1=debutzoneinconnue 2=zoneconnue
    if(status==0)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    {//p[index]=255;p[index+1]=255;p[index+2]=255;
    if(old_line[x]!=0){xstart=x;oldpixel=old_line[x];Ssurfacepx[old_line[x]]++;surfacespresentes[old_line[x]]=1; /*Symin[old_line[x]]=y;*//*Symax[old_line[x]]=y;*/if(Sxmax[old_line[x]]<x){Sxmax[old_line[x]]=x;} if(Sxmin[old_line[x]]>x){Sxmin[old_line[x]]=x;}status=2;oldpixel=old_line[x];}else{status=1;xstart=x;}
    buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];
    }
    else{buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];old_line[x]=0;}
    }

    else if(status==1)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    {//p[index]=255;p[index+1]=255;p[index+2]=255;

    if(old_line[x]!=0){for(unsigned int ioldline=xstart;ioldline<=x;ioldline+=3){old_line[ioldline]=old_line[x];}status=2;surfacespresentes[old_line[x]]=1;oldpixel=old_line[x];/*old_line[x]=0;*/}
    buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];
    }else{buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];iboucle=1;while((iboucle<nbr_surfaces_max)&&(Ssurfaces[iboucle]==1)){iboucle++;}Ssurfaces[iboucle]=1;Sxmin[iboucle]=xstart;Sxmax[iboucle]=x;Symin[iboucle]=y;Symax[iboucle]=y;Ssurfacepx[iboucle]=((x-xstart)/3);surfacespresentes[iboucle]=1;for(unsigned int i=xstart;i<x;i+=3){old_line[i]=iboucle;}old_line[x]=0;oldpixel=0;status=0;}
    }

    else if(status==2)
    {if((((unsigned int)p[index]+255<(unsigned int)buffer[index]+255-coefseuil)||((unsigned int)p[index]>(unsigned int)buffer[index]+coefseuil)) || (((unsigned int)p[index+1]+255<(unsigned int)buffer[index+1]+255-coefseuil)||((unsigned int)p[index+1]>(unsigned int)buffer[index+1]+coefseuil)) || (((unsigned int)p[index+2]+255<(unsigned int)buffer[index+2]+255-coefseuil)||((unsigned int)p[index+2]>(unsigned int)buffer[index+2]+coefseuil)) )
    {//printf("\n\np1:%ld buffer1:%ld\np2:%ld buffer2:%ld\np3:%ld buffer3:%ld",p[index],buffer[index],p[index+1],buffer[index+1],p[index+2],buffer[index+2]); //p[index]=255;p[index+1]=255;p[index+2]=255;
    if(old_line[x]==0){old_line[x]=oldpixel; }
    else{
    if(oldpixel!=old_line[x]){Ssurfacepx[oldpixel]+=Ssurfacepx[old_line[x]];Ssurfacepx[old_line[x]]=0; if(Sxmin[oldpixel]>Sxmin[old_line[x]]){Sxmin[oldpixel]=Sxmin[old_line[x]];} if(Sxmax[oldpixel]<Sxmax[old_line[x]]){Sxmax[oldpixel]=Sxmax[old_line[x]];} if(Symin[oldpixel]>Symin[old_line[x]]){Symin[oldpixel]=Symin[old_line[x]];}Symax[oldpixel]=y;Sxmin[old_line[x]]=LARGEUR_VIDEO*3;Sxmax[old_line[x]]=0;Symin[old_line[x]]=HAUTEUR_VIDEO;Symax[old_line[x]]=0; surfacespresentes[old_line[x]]=0;surfacespresentes[oldpixel]=1;unsigned int tempvar=old_line[x];Ssurfaces[oldpixel]=1;Ssurfaces[old_line[x]]=1; for(unsigned int i=0;i<LARGEUR_VIDEO*3;i+=3){if(old_line[i]==tempvar){old_line[i]=oldpixel;}} }
    }
    buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];

    }else{buffer[index]=p[index];buffer[index+1]=p[index+1];buffer[index+2]=p[index+2];if(Sxmin[oldpixel]>xstart){Sxmin[oldpixel]=xstart;} if(Sxmax[oldpixel]<x){Sxmax[oldpixel]=x;}Symax[oldpixel]=y;Ssurfacepx[oldpixel]+=((x-xstart)/3);old_line[x]=0;status=0;oldpixel=0;surfacespresentes[oldpixel]=1;}
    }

    //buffer[index]=p[index];
    //buffer[index+1]=p[index+1];
    //buffer[index+2]=p[index+2];

    }//fin ligne x

    if(status==1){iboucle=1;while((iboucle<nbr_surfaces_max)&&(Ssurfaces[iboucle]==1)){iboucle++;}Ssurfaces[iboucle]=1;Sxmin[iboucle]=xstart;Sxmax[iboucle]=LARGEUR_VIDEO*3;Symin[iboucle]=y;Symax[iboucle]=y;Ssurfacepx[iboucle]=((LARGEUR_VIDEO-xstart)/3);surfacespresentes[iboucle]=1;for(unsigned int i=xstart;i<LARGEUR_VIDEO*3;i+=3){old_line[i]=iboucle;}old_line[LARGEUR_VIDEO*3-3]=0;oldpixel=0;status=0;}
    if(status==2){Ssurfaces[oldpixel]=1; surfacespresentes[oldpixel]=1; if(Sxmin[oldpixel]>xstart){Sxmin[oldpixel]=xstart;} if(Sxmax[oldpixel]<LARGEUR_VIDEO*3){Sxmax[oldpixel]=LARGEUR_VIDEO*3;}Symax[oldpixel]=y;Ssurfacepx[oldpixel]+=(((LARGEUR_VIDEO*3)-xstart)/3);old_line[LARGEUR_VIDEO*3-3]=0;status=0;oldpixel=0;}


    //si une surface disparait, crééer objet
    for(unsigned int i=0;i<nbr_surfaces_max;i++)
    {

    //printf("\nold:%ld new:%ld",oldsurfacespresentes[i],surfacespresentes[i]);
    if(/*(oldsurfacespresentes[i]==1)&&*/surfacespresentes[i]==0)
    {

    //if(Ssurfacepx[i]>object_surfacepx_min&&Ssurfacepx[i]<500000000&&((((Sxmax[i]-Sxmin[i])/3)/(Symax[i]-Symin[i]))<5)&&(((Symax[i]-Symin[i])/((Sxmax[i]-Sxmin[i])/3))<5) )
    if(Ssurfacepx[i]>object_surfacepx_min && Ssurfacepx[i]<500000000 )//&& ((Sxmax[i]-Sxmin[i])/3)>20 && (Symax[i]-Symin[i])>20 && ((((Sxmax[i]-Sxmin[i])/3)/(Symax[i]-Symin[i]))<5) && (((Symax[i]-Symin[i])/((Sxmax[i]-Sxmin[i])/3))<5) )
    {
    unsigned int pox=(Sxmin[i]/3)+((Sxmax[i]/3)-(Sxmin[i]/3))/2;
    unsigned int poy=(Symin[i])+((Symax[i])-(Symin[i]))/2;
    //if(pox<25){pox=25;}
    //if(poy<25){poy=25;}
    //if(pox>LARGEUR_VIDEO-25){pox=LARGEUR_VIDEO-25;}
    // if(poy>HAUTEUR_VIDEO){poy=HAUTEUR_VIDEO-25;}
    //printf("\ni:%ld xmin:%ld xmax:%ld ymin:%ld ymax:%ld s:%ld",i,(Sxmin[i]/3),(Sxmax[i]/3),Symin[i],Symax[i],Ssurfacepx[i]);


    for(unsigned int draw=0;draw<Sxmax[i]-Sxmin[i];draw+=3)//horizontal croix
    {
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw]=0;
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw+1]=0;
    p[Sxmin[i]+((Symin[i]+(Symax[i]-Symin[i])/2)*LARGEUR_VIDEO*3)+draw+2]=255;
    }

    for(unsigned int draw=0;draw<=Symax[i]-Symin[i];draw+=1)//vertical croix
    {
    p[(Sxmin[i]/3+((Sxmax[i]/3-Sxmin[i]/3)/2))*3+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=0;
    p[(Sxmin[i]/3+((Sxmax[i]/3-Sxmin[i]/3)/2))*3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=0;
    p[(Sxmin[i]/3+((Sxmax[i]/3-Sxmin[i]/3)/2))*3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=255;
    }







    #define B 0
    #define G 255
    #define R 0
    for(unsigned int draw=0;draw<Sxmax[i]-Sxmin[i];draw+=3)//horizontal carre
    {
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw-3]=B;
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw+1]=G;
    p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+draw+2]=R;

    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw]=B;
    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw+1]=G;
    p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+draw+2]=R;

    }

    for(unsigned int draw=0;draw<=Symax[i]-Symin[i];draw+=1)//vertical carre
    {
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=B;
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=G;
    p[Sxmin[i]+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=R;

    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)]=B;
    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+1]=G;
    p[Sxmax[i]-3+((Symin[i]+draw)*LARGEUR_VIDEO*3)+2]=R;

    }

    CvPoint origine;
    origine.x=Sxmin[i]/3;
    origine.y=Symin[i];
    unsigned char numerobox[10]={0};

    CvFont * font = new CvFont;
    cvInitFont(font, CV_FONT_VECTOR0, 0.5f, 1.0f, 0, 1, 8); //rate of width and height is 1:2
    char szText[4];
    sprintf(szText, "%ld",i); //make string
    cvPutText(image, szText, origine, font, CV_RGB(255, 255, 255)); //draw text on the IplImage* (Image)
    //p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)]=255;p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmin[i]+(Symin[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)]=255;p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmax[i]+(Symin[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)]=255;p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmin[i]+(Symax[i]*LARGEUR_VIDEO*3)+2]=255;
    //p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)]=255;p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)+1]=255;p[Sxmax[i]+(Symax[i]*LARGEUR_VIDEO*3)+2]=255;




    buzz=1;
    }
    Ssurfaces[i]=0;
    Sxmin[i]=LARGEUR_VIDEO*3;
    Sxmax[i]=0;
    Symin[i]=HAUTEUR_VIDEO;
    Symax[i]=0;
    Ssurfacepx[i]=0;

    }


    //oldsurfacespresentes[i]=surfacespresentes[i];
    }




    }

    }






    #endif


















    // On affiche l'image dans une fenêtre
    cvShowImage( "Cam Window", image);

    //printf("\nBoldbuzz:%ld buzz:%ld",oldbuzz,buzz);
    if(oldbuzz==1&&buzz==0){oldbuzz=0;PlaySound(NULL, NULL, NULL);}
    else if(oldbuzz==0&&buzz==1){oldbuzz=1;PlaySound("buzzer.wav", NULL, SND_FILENAME|SND_ASYNC|SND_LOOP);}
    //printf("\nColdbuzz:%ld buzz:%ld\n",oldbuzz,buzz);

    // On attend 10ms
    key = cvWaitKey(10);

    }

    //cvReleaseImage(&image);
    cvReleaseCapture(&capture);
    cvDestroyWindow("Cam Window");

    return 0;

    }

    </code>

    PS: c'est pas le top mais c'est un petit début...
    RE-PS: je sais, je code comme un cochon...

    good luck friends!

Discussions similaires

  1. Soustraction d'arrière-plan en utilisant MOG
    Par gigi_dev dans le forum OpenCV
    Réponses: 0
    Dernier message: 16/10/2012, 21h31
  2. Suppression de fond (soustraction d'arrière-plan)
    Par Renaud-62 dans le forum OpenCV
    Réponses: 1
    Dernier message: 22/10/2009, 13h11
  3. comment stoper 1 thread d'arrière-plan
    Par ms91fr dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2003, 17h46
  4. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo