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.