2014-03-02 16 views
0

我想寫一個簡單的C++腳本使用opencv來檢測面部並保存每個新面孔在相機中出現一個面部方形框。框架應該是正確的,但我正在努力與指針/ ESP。 cvseq周圍的「總數」。有人能幫助我嗎?每當它到達「cvSeqPush(faces_new,r);」這一行時,faces_new在faces_new-> total中顯示爲60或70,沒有被分配任何東西....非常沮喪,並且非常感謝一些幫助。在cvseq推送和使用c + +的opencv中的大小的問題

// memeory allocation 
static CvMemStorage* storage = 0; 
storage = cvCreateMemStorage(0); 
static CvMemStorage* storage2 = 0; 
storage2 = cvCreateMemStorage(0); 
static CvMemStorage* storage3 = 0; 
storage3 = cvCreateMemStorage(0); 

// Create a new named window with title: result 
cvNamedWindow("Window"); // create a window to display in 
CvCapture* capture = capture = cvCaptureFromCAM(-1); // capture from video device (Macbook iSight) 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1000);// set window size to 640 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 600); // set window size to 480 

// Declare images 
IplImage *imgCamera; // captured from camera 
IplImage *imgCamera_last; // last campera image 
IplImage *imgDrawn; // image with drawing (rect containing faces) 
IplImage *imgFace; // face picture extracted from the camera 
CvRect *r; // rects containing faces 
CvSeq *faces = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvRect), storage); ; // sequnece of faces in the camera image - CURRENT 
CvSeq *faces_last = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvRect), storage2); // sequnece of faces in the camera image - LAST FRAME 
CvSeq *faces_new = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvRect), storage3); // sequnece of faces in the camera image - NEW FACES 
float scale = 1.0/5; // how far do we want to scale down the haar detect objects images for speed 

// Create a new Haar classifier 
static CvHaarClassifierCascade* cascade = 0; 
cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0); 

// file name where to save the file 
std::stringstream filename; 

int counter = 1; 
int filecounter = 1; 
while(1) { 
    //*************************************************************************************/ 
    //Step 1: stream video. Video to images 
    //*************************************************************************************/ 

    // capture frame from video and then turn it into one single image-imgCamera 
    capture_frame(capture, imgCamera); 

    // allocate an image to be used later 
    imgDrawn = cvCreateImage(cvGetSize(imgCamera), imgCamera->depth, imgCamera->nChannels); 
    imgFace = cvCreateImage(cvSize(600, 600), imgCamera->depth, imgCamera->nChannels); 
    cvCopy(imgCamera, imgDrawn); 

    if (counter == 10) { // take action for every 10 frames 

     counter = 1; 
     //*************************************************************************************/ 
     //Step 2: Detection 
     //*************************************************************************************/ 
     find_faces(imgCamera, storage, cascade, faces, scale); 
     //printf("Last faces seq had %d faces detected. \n",faces_last->total); 

     //*************************************************************************************/ 
     //Step 4: Draw every face in the picture 
     //*************************************************************************************/ 

     // for each face found in the image 
     for(int i = 0; i < (faces ? faces->total : 0); i++){ 
      // get the rect from the sequence 
      r = (CvRect*)cvGetSeqElem(faces, i); 

      // draw the rectange around the face on the imgDrawn 
      draw_rect(imgDrawn, r, scale); 
     } 

     cvShowImage("Window", imgDrawn); 
     // press escape to quit 
     if(cvWaitKey(33) == 27) break; 
     //*************************************************************************************/ 
     //Step 3: Recognize the new faces 
     //*************************************************************************************/ 
     //TO DO: Combined the following into a funciton: match_faces(faces_new, faces, faces_last, lastspotted, currentspotted, imgCamera); 
     for(int i = 0; i < (faces ? faces->total : 0); i++){ 
      cout << "faces_new"<< faces_new->total<< "\n"; 
      // get the rect from the sequence 
      r = (CvRect*)cvGetSeqElem(faces, i); 
      if (faces_last->total == 0) { 
       //cout << "New PERSON!!"; 
       cvSeqPush(faces_new, r); 
      } 
      else { 
       for(int k = 0; k < (faces_last ? faces_last->total : 0); k++){ 
        CvRect *r_last = (CvRect*)cvGetSeqElem(faces_last, k); 
        if (!same_face(r, r_last, imgCamera, imgCamera_last, i, k)) { 
         cvSeqPush(faces_new, r); 
         //cout << "faces_new"<< faces_new->total<< "\n"; 
        } 
       } 
      } 
     } 

     //*************************************************************************************/ 
     //Step 3: Process faces - save new faces, report new faces 
     //*************************************************************************************/ 

     if ((faces_new->total)>0) { 
      // To change to save only faces_new 
      save_faces(faces_new, imgCamera, imgFace, scale, filecounter); 
      // report_faces(filecounter, faces_new->total, model); // report new faces stored starting from filecounter 
      filecounter = filecounter+(faces_new-> total);} 

     cvClearMemStorage(storage2); 
     cvSeqPush(faces_last, faces); 
     //cout << "face_last:" << faces_last->total << "\n";} 
     cvClearMemStorage(storage); 
     cvClearMemStorage(storage3); 
    } 
    counter++; 
    imgCamera_last = imgCamera; 

} 

cvReleaseCapture(&capture); 
cvReleaseImage(&imgCamera); 
cvReleaseImage(&imgDrawn); 
cvReleaseImage(&imgFace); 
cvDestroyWindow("window"); 
+4

改用C++ api(你會得到一個正確的'vector ')。老實說,c-api已被棄用,你不應該再使用它了。 – berak

+0

謝謝!可以使用矢量...自己想出來,主要是內存問題。 – user3370428

回答

0

終於搞定了。

// memeory allocation 
static CvMemStorage* storage = 0; 
storage = cvCreateMemStorage(0); 
static CvMemStorage* storage2 = 0; 
storage2 = cvCreateMemStorage(0); 

// Create a new named window with title: result 
cvNamedWindow("Window"); // create a window to display in 
CvCapture* capture = capture = cvCaptureFromCAM(-1); // capture from video device (Macbook iSight) 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1000);// set window size to 640 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 600); // set window size to 480 

// Declare images 
IplImage *imgCamera; // captured from camera 
IplImage *imgCamera_last; // last campera image 
IplImage *imgDrawn; // image with drawing (rect containing faces) 
IplImage *imgFace; // face picture extracted from the camera 
CvRect *r; // rects containing faces 
CvSeq *faces = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvRect), storage); ; // sequnece of faces in the camera image - CURRENT 
CvSeq *faces_last = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvRect), storage2); // sequnece of faces in the camera image - LAST FRAME 
float scale = 1.0/5; // how far do we want to scale down the haar detect objects images for speed 

// Create a new Haar classifier 
static CvHaarClassifierCascade* cascade = 0; 
cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0); 

// file name where to save the file 
std::stringstream filename; 

int counter = 1; 
int filecounter = 1; 
while(1) { 
    //*************************************************************************************/ 
    //Step 1: stream video. Video to images 
    //*************************************************************************************/ 

    // capture frame from video and then turn it into one single image-imgCamera 
    capture_frame(capture, imgCamera); 

    // allocate an image to be used later 
    imgDrawn = cvCreateImage(cvGetSize(imgCamera), imgCamera->depth, imgCamera->nChannels); 
    imgFace = cvCreateImage(cvSize(600, 600), imgCamera->depth, imgCamera->nChannels); 
    cvCopy(imgCamera, imgDrawn); 

    if (counter == 10) { // take action for every 10 frames 

     counter = 1; 
     //*************************************************************************************/ 
     //Step 2: Detection 
     //*************************************************************************************/ 
     find_faces(imgCamera, storage, cascade, faces, scale); 
     //printf("Last faces seq had %d faces detected. \n",faces_last->total); 

     //*************************************************************************************/ 
     //Step 4: Draw every face in the picture 
     //*************************************************************************************/ 

     // for each face found in the image 
     for(int i = 0; i < (faces ? faces->total : 0); i++){ 
      // get the rect from the sequence 
      r = (CvRect*)cvGetSeqElem(faces, i); 

      // draw the rectange around the face on the imgDrawn 
      draw_rect(imgDrawn, r, scale); 
     } 

     cvShowImage("Window", imgDrawn); 
     // press escape to quit 
     if(cvWaitKey(33) == 27) break; 
     //*************************************************************************************/ 
     //Step 3: Recognize the new faces 
     //*************************************************************************************/ 
     //TO DO: Combined the following into a funciton: match_faces(faces_new, faces, faces_last, lastspotted, currentspotted, imgCamera); 
     for(int i = 0; i < (faces ? faces->total : 0); i++){ 
      // get the rect from the sequence 
      r = (CvRect*)cvGetSeqElem(faces, i); 
      if (faces_last->total == 0) { 
       cout<<"a face appeared: "<<"there are total faces of "<<faces_last->total<<"\n"; 
       save_face(r, imgCamera, imgFace, scale, filecounter); 
       filecounter++; 
       //report_faces(filecounter, faces_new->total, model); // report new faces stored starting from filecounter 
      } 
      else { 
       for(int k = 0; k < (faces_last ? faces_last->total : 0); k++){ 
        CvRect *r_last = (CvRect*)cvGetSeqElem(faces_last, k); 
        if (!same_face(r, r_last, imgCamera, imgCamera_last, i, k)) { 
         save_face(r, imgCamera, imgFace, scale, filecounter); 
         filecounter++; 
         //report_faces(filecounter, faces_new->total, model); // report new faces stored starting from filecounter 
        } 
       } 
      } 
     } 

     //cvClearMemStorage(storage2); 
     while (faces_last->total >0) { 
      cvSeqPop(faces_last);} 

     for(int i = 0; i < (faces ? faces->total : 0); i++){ 
      // get the rect from the sequence 
      r = (CvRect*)cvGetSeqElem(faces, i); 
      cvSeqPush(faces_last, r); 
     } 
     //cout << "face_last:" << faces_last->total << "\n";} 
     cvClearMemStorage(storage); 
    } 
    counter++; 
    imgCamera_last = imgCamera; 

} 

cvReleaseCapture(&capture); 
cvReleaseImage(&imgCamera); 
cvReleaseImage(&imgDrawn); 
cvReleaseImage(&imgFace); 
cvDestroyWindow("window"); 

// return 0 to indicate successfull execution of the program 
return 0;