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

C++ Discussion :

fusionner 2 programmes de reconnaissance d'image


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut fusionner 2 programmes de reconnaissance d'image
    Bonjour

    Mon projet consiste à reconnaître les panneau de signalisation le long d'une route. J'ai donc 2 programme: 1 qui permet de détecter les triangle dans le flux de la webcam et un autre qui permet de rechercher le rouge dans le flux de la webcam. Mais je voudrais fusionner c'est 2 programme en 1 en utilisant les appel de fonction mais je ne sais pas comment faire j'ai cherche sur internet met je n'arrive pas.

    Je voudrait d'abord détecter la couleur rouge et si il y a du rouge on cherche si il y a un triangle.

    J'utilise Microsoft Visual studio 2013 avec la bibliothèque opencv

    Mon premier programme qui détecte les triangle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    #include <iostream>
    #include <ctype.h>
    #include <sstream>
    #include "opencv\cv.h"
    #include "opencv\highgui.h"
     
    using namespace std;
     
    IplImage* imgTracking = 0;
     
    int lastX1 = -1;
    int lastY1 = -1;
     
    int lastX2 = -1;
    int lastY2 = -1;
     
    void trackObject(IplImage* imgThresh){
        CvSeq* contour;  //hold the pointer to a contour
        CvSeq* result;     //hold sequence of points of a contour
        CvMemStorage *storage = cvCreateMemStorage(0); //storage area for all contours
     
        //finding all contours in the image
        cvFindContours(imgThresh, storage, &contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
     
        //iterating through each contour
        while (contour)
        {
            //obtain a sequence of points of the countour, pointed by the variable 'countour'
            result = cvApproxPoly(contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0);
     
            //if there are 3 vertices  in the contour and the area of the triangle is more than 100 pixels
            if (result->total == 3 && fabs(cvContourArea(result, CV_WHOLE_SEQ))>100)
            {
                //iterating through each point
                CvPoint *pt[3];
                for (int i = 0; i<3; i++){
                    pt[i] = (CvPoint*)cvGetSeqElem(result, i);
                }
                //drawing lines around the triangle
                cvLine(imgTracking, *pt[0], *pt[1], cvScalar(255, 0, 0), 4);
                cvLine(imgTracking, *pt[1], *pt[2], cvScalar(255, 0, 0), 4);
                cvLine(imgTracking, *pt[2], *pt[0], cvScalar(255, 0, 0), 4);
            }
     
            //obtain the next contour
            contour = contour->h_next;
        }
     
        cvReleaseMemStorage(&storage);
    }
     
     
    int main(){
        //load the video file to the memory
        CvCapture* capture = 0;
     
        capture = cvCaptureFromCAM(0);
     
        if (!capture){
            printf("Capture failure\n");
            return -1;
        }
     
        IplImage* frame = 0;
        frame = cvQueryFrame(capture);
        if (!frame) return -1;
     
        //create a blank image and assigned to 'imgTracking' which has the same size of original video
        imgTracking = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
        cvZero(imgTracking); //covert the image, 'imgTracking' to black
     
        cvNamedWindow("Video");
        cvNamedWindow("Videos");
        //iterate through each frames of the video    
        while (true){
     
            frame = cvQueryFrame(capture);
            if (!frame) break;
            frame = cvCloneImage(frame);
     
            //smooth the original image using Gaussian kernel
            cvSmooth(frame, frame, CV_GAUSSIAN, 3, 3);
     
            //converting the original image into grayscale
            IplImage* imgGrayScale = cvCreateImage(cvGetSize(frame), 8, 1);
            cvCvtColor(frame, imgGrayScale, CV_BGR2GRAY);
     
            //thresholding the grayscale image to get better results
            cvThreshold(imgGrayScale, imgGrayScale, 100, 255, CV_THRESH_BINARY_INV);
     
            //track the possition of the ball
            trackObject(imgGrayScale);
     
            // Add the tracking image and the frame
            cvAdd(frame, imgTracking, frame);
     
            cvShowImage("Video", frame);
            cvShowImage("Videos", imgTracking);
            //Clean up used images
            cvReleaseImage(&imgGrayScale);
            cvReleaseImage(&frame);
     
            //Wait 10mS
            int c = cvWaitKey(10);
            //If 'ESC' is pressed, break the loop
            if ((char)c == 27) break;
        }
     
        cvDestroyAllWindows();
        cvReleaseImage(&imgTracking);
        cvReleaseCapture(&capture);
     
        return 0;
    }
    Mon second programme qui détecte le rouge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    #include <iostream>
    #include <ctype.h>
    #include <sstream>
    #include "opencv\cv.h"
    #include "opencv\highgui.h"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
     
     
    //This function threshold the HSV image and create a binary image
    IplImage* GetThresholdedImage(IplImage* imgHSV){
        IplImage* imgThresh = cvCreateImage(cvGetSize(imgHSV), IPL_DEPTH_8U, 1);
        cvInRangeS(imgHSV, cvScalar(129, 117, 62), cvScalar(180, 256, 256), imgThresh);
        return imgThresh;
    }
     
    int main(){
        CvCapture* capture = 0;
     
        capture = cvCaptureFromCAM(0);
        if (!capture){
            printf("Capture failure\n");
            return -1;
        }
     
        IplImage* frame = 0;
     
        cvNamedWindow("Video");
        cvNamedWindow("Ball");
     
     
        //iterate through each frames of the video     
        while (true){
     
            frame = cvQueryFrame(capture);
            if (!frame) break;
     
            frame = cvCloneImage(frame);
            cvSmooth(frame, frame, CV_GAUSSIAN, 3, 3); //smooth the original image using Gaussian kernel
     
            IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
            cvCvtColor(frame, imgHSV, CV_BGR2HSV); //Change the color format from BGR to HSV
            IplImage* imgThresh = GetThresholdedImage(imgHSV);
     
            cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN, 3, 3); //smooth the binary image using Gaussian kernel
     
            cvShowImage("Ball", imgThresh);
            cvShowImage("Video", frame);
     
            //Clean up used images
            cvReleaseImage(&imgHSV);
            cvReleaseImage(&imgThresh);
            cvReleaseImage(&frame);
     
            //Wait 50mS
            int c = cvWaitKey(10);
            //If 'ESC' is pressed, break the loop
            if ((char)c == 27) break;
        }
     
        cvDestroyAllWindows();
        cvReleaseCapture(&capture);
     
        return 0;
    }
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Je n'ai jeté qu'un oeil distrait en diagonale sur le code, mais, comme tu dispose déjà des deux fonctions qui font chacune une partie du travail, cela devient facile : Si tu regarde attentivement les deux fonctions main, tu remarquera qu'il n'y a finalement que quelques détails qui changent : le nom de certaines variables (imgHSV, imgTracking de l'autre), quelques valeurs ("Video" et "Ball" d'un coté, "Video" et "Videos" de l'autre, plus quelques autres peut être).

    Tu pourrais donc assez facilement créer une fonction qui reprendrait l'ensemble de la boucle while(true)(*) et qui utiliserait un argument pour savoir quelle fonction appeler. Elle pourrait aussi prendre les chaines de caractères à transmettre à cvShowImage

    Une fois que c'est fait, il ne te reste plus qu'à organiser correctement ton projet:
    • un fichier d'en-tête (*.hpp) qui déclare les trois fonctions (comprends: les deux fonctions existantes et celle que je viens de te proposer de créer)
    • un fichier d'implémenttation (*.cpp) qui fournit l'implémentation de ces trois fonctions
    • un fichier main.cpp qui fournit la fonction main
    Je t'ai donné les grandes lignes, à toi de faire le reste . Mais si tu éprouves des difficultés, n'hésites pas à venir demander des précisions
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Salut
    Donc si j'ai bien suivi se que tu as dit voila:
    ma fonction while pour détecter rouge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void bouclecouleur(IplImage* frame, CvCapture* capture, IplImage* GetThresholdedImage(IplImage* imgHSV))
    {
     
     
    		frame = cvQueryFrame(capture);
    		frame = cvCloneImage(frame);
    		cvSmooth(frame, frame, CV_GAUSSIAN, 3, 3); //smooth the original image using Gaussian kernel
     
    		IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
    		cvCvtColor(frame, imgHSV, CV_BGR2HSV); //Change the color format from BGR to HSV
    		IplImage* imgThresh = GetThresholdedImage(imgHSV);
     
    		cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN, 3, 3); //smooth the binary image using Gaussian kernel
    	}
    et ma fonction while pour détecter triangle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void boucletriangle(IplImage* frame, CvCapture* capture, IplImage* imgTracking, void trackObject(IplImage* imgThresh))
    {
     
     
    	frame = cvQueryFrame(capture);
    	frame = cvCloneImage(frame);
    	cvSmooth(frame, frame, CV_GAUSSIAN, 3, 3); //smooth the original image using Gaussian kernel
     
    	IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
    	cvCvtColor(frame, imgHSV, CV_BGR2GRAY); //Change the color format from BGR to HSV
    	cvThreshold(imgHSV, imgHSV, 100, 255, CV_THRESH_BINARY_INV);
    	//track the possition of the ball
    	trackObject(imgHSV);
     
    	// Add the tracking image and the frame
    	cvAdd(frame, imgTracking, frame);
     
    }
    Donc je doit mettre c'est 2 fonction et les 2 autres d'en un fichier d'en-tête mais je ne vois pas ce que je doit mettre dans le fichier d’implémentation

    merci d'avance

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par abdessamad4500 Voir le message
    Donc je doit mettre c'est 2 fonction et les 2 autres d'en un fichier d'en-tête mais je ne vois pas ce que je doit mettre dans le fichier d’implémentation
    Au hasard : l'implémentation des fonctions et leur appel depuis un main ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Recherche logiciel programmation analyse video/reconnaissance d'image
    Par MoneyCivius dans le forum Logiciels Libres & Open Source
    Réponses: 0
    Dernier message: 10/09/2014, 10h15
  2. Réponses: 2
    Dernier message: 05/07/2006, 15h21
  3. Programme qui créer des images d'après une vidéo
    Par snoopy69 dans le forum Vidéo
    Réponses: 7
    Dernier message: 03/04/2006, 08h33
  4. programmer une séquence d'images
    Par sino dans le forum C++Builder
    Réponses: 5
    Dernier message: 14/02/2006, 11h57
  5. Programme de gestion d'image qui permet de tout renommer
    Par snoopy69 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 07/02/2006, 07h08

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