Eine Frage zu OpenCV



  • liebe community,

    bin ganz neu auf dem Forum und muss schon eine lästige Frage stellen 🙂
    Ich arbeite gerade mit OpenCV.
    Habe mir ein Gesichtserkennungstool zusammengebastelt, was ganz gut funktioniert.
    Die Gesichter werden erkannt und eines wird auch als extra Datei abgespeichert.
    Ich würde aber gerne alle erkannten Bilder in extra Dateien abspeichern.

    Hier ist mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <cv.h>
    #include <cvaux.h>
    #include <highgui.h>
    #include <math.h>
    
    #define PI 3.1415926535898
    double rads(double degs)
    {
            return (PI/180 * degs);
    }
    
    int main(int argc, char *argiv[])
    
    {
        if ( argc != 2 ) /* argc should be 2 for correct execution */
        {
            /* We print argv[0] assuming it is the program name */
            printf( "usage: %s filename", argiv[0] );
        }
        else
        {
            // We assume argv[1] is a filename to open
            FILE *file = fopen( argiv[1], "r" );
    
            /* fopen returns 0, the NULL pointer, on failure */
             if ( file == 0 )
            {
                printf( "Could not open file\n" );
            }
    
    }
            //declaration block
    
    char *block1_arg_Filename = argiv[1];
    IplImage * block1_img_o1 = NULL;
    IplImage * block2_img_i1 = NULL;
    CvPoint block2_point_o1 = cvPoint(0,0);
    CvRect block2_rect_o2 = cvRect( 0, 0, 1, 1);
    IplImage * block2_img_o3 = NULL;
    double block2_double_o4 = 0.0;
    static CvMemStorage* block2_storage = 0;
    static CvHaarClassifierCascade* block2_cascade = 0;
    const char* block2_cascade_name = "/usr/share/harpia/images/haarcascade_frontalface_alt2.xml";
    IplImage * block12_img_i1 = NULL;
    IplImage * block12_img_o1 = NULL;
    IplImage * block7_img_i1 = NULL;
    IplImage * block7_img_o1 = NULL;
    CvRect  block7_rect_i2;
    IplImage * block8_img_i1 = NULL;
    IplImage * block8_img_o1 = NULL;
    
            //execution block
    //Weight: 1
    block1_img_o1 = cvLoadImage(block1_arg_Filename,-1);
    block2_img_i1 = cvCloneImage(block1_img_o1);// IMAGE conection
    //Weight: 2
    
    if(block2_img_i1){
            double scale = 1.3;
            block2_cascade = (CvHaarClassifierCascade*)cvLoad( block2_cascade_name, 0, 0, 0 );
            IplImage* gray = cvCreateImage( cvSize(block2_img_i1->width,block2_img_i1->height), 8, 1 );
    IplImage* small_img = cvCreateImage( cvSize( cvRound (block2_img_i1->width/scale), cvRound (block2_img_i1->height/scale)),8, 1 );
            cvCvtColor( block2_img_i1, gray, CV_BGR2GRAY );
            cvResize( gray, small_img, CV_INTER_LINEAR );
            cvEqualizeHist( small_img, small_img );
            if(!block2_img_o3)
            block2_img_o3 = cvCloneImage(block2_img_i1);
            cvCopy(block2_img_i1,block2_img_o3,0);
            block2_storage = cvCreateMemStorage(0);
            cvClearMemStorage( block2_storage );
            block2_rect_o2 = cvRect( 0, 0, 1, 1);
            CvSeq* faces = cvHaarDetectObjects( small_img, block2_cascade, block2_storage,1.1, 2.0, 0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(30, 30) );
            block2_double_o4 = faces->total;
            if(faces)
            {
                    int i;
                    for( i = 0; i < (faces ? faces->total : 0); i++ )
                    {
                    CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
                            if(r)
                            {
                                    CvPoint center;
                                    int radius;
                                    center.x = cvRound((r->x + r->width*0.5)*scale);
                                    center.y = cvRound((r->y + r->height*0.75)*scale);
                                    radius = cvRound((r->width + r->height)*0.3*scale);
                                    cvCircle( block2_img_o3, center, radius, cvScalarAll(0), 3, 8, 0 );
                                    if(i == 0)
                                    {
                                            block2_point_o1 = center;
                                            block2_rect_o2.x = (r->x)*scale;
                                            block2_rect_o2.y = (r->y)*scale;
                                            block2_rect_o2.width = (r->width)*scale;
                                            block2_rect_o2.height = (r->height)*scale;
                                    }
    }
                    }
    
            }
    
            cvReleaseImage( &gray );
            cvReleaseImage( &small_img );
    }
    block7_rect_i2 = block2_rect_o2;// RECT conection
    block7_img_i1 = cvCloneImage(block2_img_o3);// IMAGE conection
    block12_img_i1 = cvCloneImage(block2_img_o3);// IMAGE conection
    //Weight: 3
    block12_img_o1 = cvCloneImage(block12_img_i1);
    
    if(block12_img_i1)
    cvSaveImage("/home/user/Desktop/facedetect.png" ,block12_img_i1, 0);
    //Weight: 5
    
    if(block7_img_i1){
            block7_rect_i2.x = MAX(0,block7_rect_i2.x);//Check whether point is negative
            block7_rect_i2.y = MAX(0,block7_rect_i2.y);
            block7_rect_i2.x = MIN(block7_img_i1->width-1,block7_rect_i2.x);//Check whether point is out of the image
            block7_rect_i2.y = MIN(block7_img_i1->height-1,block7_rect_i2.y);
            block7_rect_i2.width = MIN(block7_img_i1->width-block7_rect_i2.x,block7_rect_i2.width);//Check whether rect reaches out of the image
            block7_rect_i2.height = MIN(block7_img_i1->height-block7_rect_i2.y,block7_rect_i2.height);
            block7_img_o1 = cvCreateImage(cvSize(block7_rect_i2.width,block7_rect_i2.height), block7_img_i1->depth,block7_img_i1->nChannels);
            cvSetImageROI(block7_img_i1,block7_rect_i2);
            cvCopyImage(block7_img_i1,block7_img_o1);
    }
    block8_img_i1 = cvCloneImage(block7_img_o1);// IMAGE conection
    //Weight: 6
    block8_img_o1 = cvCloneImage(block8_img_i1);
                    }
    
            }
        }
    }
            cvReleaseImage( &gray );
            cvReleaseImage( &small_img );
    }
    block7_rect_i2 = block2_rect_o2;// RECT conection
    block7_img_i1 = cvCloneImage(block2_img_o3);// IMAGE conection
    block12_img_i1 = cvCloneImage(block2_img_o3);// IMAGE conection
    //Weight: 3
    block12_img_o1 = cvCloneImage(block12_img_i1);
    
    if(block12_img_i1)
    cvSaveImage("/home/user/Desktop/facedetect.png" ,block12_img_i1, 0);
    //Weight: 5
    
    if(block7_img_i1){
            block7_rect_i2.x = MAX(0,block7_rect_i2.x);//Check whether point is negative
            block7_rect_i2.y = MAX(0,block7_rect_i2.y);
            block7_rect_i2.x = MIN(block7_img_i1->width-1,block7_rect_i2.x);//Check whether point is out of the image
            block7_rect_i2.y = MIN(block7_img_i1->height-1,block7_rect_i2.y);
            block7_rect_i2.width = MIN(block7_img_i1->width-block7_rect_i2.x,block7_rect_i2.width);//Check whether rect reaches out of the image
            block7_rect_i2.height = MIN(block7_img_i1->height-block7_rect_i2.y,block7_rect_i2.height);
            block7_img_o1 = cvCreateImage(cvSize(block7_rect_i2.width,block7_rect_i2.height), block7_img_i1->depth,block7_img_i1->nChannels);
            cvSetImageROI(block7_img_i1,block7_rect_i2);
            cvCopyImage(block7_img_i1,block7_img_o1);
    }
    block8_img_i1 = cvCloneImage(block7_img_o1);// IMAGE conection
    //Weight: 6
    block8_img_o1 = cvCloneImage(block8_img_i1);
    if(block8_img_i1)
    cvSaveImage("/home/user/Desktop/face.png" ,block8_img_i1, 0);
    
            cvNamedWindow("Control Window",CV_WINDOW_AUTOSIZE );
    
            //deallocation block
    cvReleaseImage(&block1_img_o1);
    cvReleaseImage(&block2_img_o3);
    cvReleaseImage(&block2_img_i1);
    cvReleaseMemStorage(&block2_storage);
    cvReleaseImage(&block12_img_o1);
    cvReleaseImage(&block12_img_i1);
    cvReleaseImage(&block7_img_o1);
    cvReleaseImage(&block7_img_i1);
    cvReleaseImage(&block8_img_o1);
    cvReleaseImage(&block8_img_i1);
    
    return 0;
    
    }
    

    Wenn ich es teste, wird nur das letze erkannte Gesicht, als Datei gespeichert.
    Ich vermute die anderen werden auch gespeichert aber überschrieben.

    Könnt ihr mir helfen, wie ich alle Gesichter abfange und in eine Datei speichern kann.

    Vielen Dank schon fürs zuende lesen des posts.
    Falls ihr eine Lösung habt wäre ich sehr dankbar wenn ihr sie teilt 🙂



  • Du musst undedingt an deinem Einrückungstil arbeiten.
    Das lesen von dem Code ist grauenvoll.

    Es gibt auch eine Vorschaufunktion.

    Ich sehe da nur eine Schleife und darin sehe keine Speicherfunktion.


Anmelden zum Antworten