2016-04-21 4 views
-1

Я начинаю использовать opencv. Я использую opencv 2.4 с VS2013. У меня был разработан код распознавания лица и его успех, но решение принято из кадра за кадром. Как я могу принять окончательное решение, объединив все фрейм или фрейм? Например, когда общее обнаруженное лицо обнаружено на 90%, окончательное решение - «ОБНАРУЖЕН ЛИЦО» и наоборот.Как отобразить окончательное решение для обнаружения лица с помощью opencv

Вот мой код:

int main(int argc, char** argv) 
{ 
    CvCapture* capture; 
    capture = cvCaptureFromFile("C:/Users/user/Desktop/Face and Motion/45.avi"); 

    //assert(capture != NULL); //terminate if capture is NULL 
    IplImage* frame; 

while (true) 
{ 
    frame = cvQueryFrame(capture); 
    if (!frame) 
     break; 
    cvShowImage("original", frame); //show 
    CvMemStorage* storage = cvCreateMemStorage(0); 
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad("C:/opencv2410/sources/data/haarcascades/haarcascade_frontalface_alt.xml"); 

    cvClearMemStorage(storage); 
    CvSeq* faces = cvHaarDetectObjects(frame, cascade, storage, 1.1, 4, 0, cvSize(40, 50)); 
    CvRect* r; 

    if (faces) //change from (!faces) to (faces) 
    { 
     for (int i = 0; i < (faces ? faces->total : 0); i++) 
     { 

      r = (CvRect*)cvGetSeqElem(faces, i); 
      //cvRectangle(frame, cvPoint(100, 50), cvPoint(200, 200), CV_RGB(255, 0, 0), 5, 8); 
      cvRectangle(frame, cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height), CV_RGB(255, 0, 0)); 

      cvShowImage("RESULTS", frame); 

      char c = cvWaitKey(1000); 
     } 
    } 
    else 
    { 
     cvShowImage("RESULT", frame); 
    } 


    printf("%d Face Found !\n", faces ? faces->total : 0); 


    if ((faces ? faces->total : 0) == 0) 
    { 
     printf("FACE NOT DETECTED !\n\n"); 
    } 
    else 
    { 
     printf("FACE DETECTED !\n\n"); 
    } 


} 
return (0); 

}

+0

Вы имеете в виду вы хотите объединить пару или более изображений в одном? –

+0

_ Я новичок OpenCV_ ... Так что ** не используйте устаревшие C api **. Вместо этого используйте C++ api! – Miki

ответ

0

вам нужны две переменные, такие как

int frame_count = 0; 
int detected_face_count = 0; 

вы должны увеличить frame_count для каждого кадра и увеличение detected_face_count при обнаружении лица. наконец, detected_face_count/frame_count дает желаемое значение.

однако, я сделал некоторые исправления в коде (я не мог проверить его)

изменения объясняются комментариями. Надеюсь, это будет полезно.

int main(int argc, char** argv) 
{ 
    CvCapture* capture; 
    capture = cvCaptureFromFile("C:/Users/user/Desktop/Face and Motion/45.avi"); 

    //assert(capture != NULL); //terminate if capture is NULL 
    IplImage* frame; 

    //you need two variables 
    int frame_count = 0; 
    int detected_face_count = 0; 

    // these lines should not be in the loop 
    CvMemStorage* storage = cvCreateMemStorage(0); 
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad("C:/opencv2410/sources/data/haarcascades/haarcascade_frontalface_alt.xml"); 

    while (true) 
    { 
     frame = cvQueryFrame(capture); 
     if (!frame) 
      break; 

     frame_count++; // increase frame_count 
     cvShowImage("original", frame); //show 

     cvClearMemStorage(storage); 
     CvSeq* faces = cvHaarDetectObjects(frame, cascade, storage, 1.1, 4, 0, cvSize(40, 50)); 
     CvRect* r; 

     for (int i = 0; i < (faces ? faces->total : 0); i++) 
     { 
      r = (CvRect*)cvGetSeqElem(faces, i); 
      //cvRectangle(frame, cvPoint(100, 50), cvPoint(200, 200), CV_RGB(255, 0, 0), 5, 8); 
      cvRectangle(frame, cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height), CV_RGB(255, 0, 0)); 
     } 

     cvShowImage("RESULT", frame); 
     char c = cvWaitKey(1000); 

     printf("%d Face Found !\n", faces ? faces->total : 0); 


     if ((faces ? faces->total : 0) == 0) 
     { 
      printf("FACE NOT DETECTED !\n\n"); 
     } 
     else 
     { 
      detected_face_count ++; // increase detected_face_count 
      printf("FACE DETECTED !\n\n"); 
     } 

    } 

    if((float)(detected_face_count/frame_count) > 0.89) 
    { 
     printf("FACES DETECTED over %90 of frames!\n\n"); 
    } 
    return (0); 
} 

, как @Miki заявил, вы не должны использовать осуждается C API

взглянуть на код ниже с помощью C++ API (протестировано с OpenCV 3.1)

#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    VideoCapture capture("C:/Users/user/Desktop/Face and Motion/45.avi"); 
    if(!capture.isOpened()) 
    { 
     printf("Video file could not be opened !\n"); 
     return -1; 
    } 

    Mat frame; 

    //you need two variables 
    int frame_count = 0; 
    int detected_face_count = 0; 

    // these lines should not be in the loop 
    CascadeClassifier cascade; 
    if(!cascade.load("C:/opencv2410/sources/data/haarcascades/haarcascade_frontalface_alt.xml")) 
    { 
     cerr << "ERROR: Could not load classifier cascade" << endl; 
     return -1; 
    } 

    while (true) 
    { 
     capture >>frame; 
     if (frame.empty()) 
      break; 

     frame_count++; // increase frame_count 
     imshow("original", frame); //show 

     vector<Rect> faces; 
     cascade.detectMultiScale(frame, faces,1.1, 4, 0, Size(40, 50)); 

     for (int i = 0; i < faces.size(); i++) 
     { 
      rectangle(frame, faces[i], Scalar(0, 0, 255)); 
     } 

     imshow("RESULT", frame); 
     char c = waitKey(10); 

     printf("%d Face Found !\n", faces.size()); 


     if (faces.size() == 0) 
     { 
      printf("FACE NOT DETECTED !\n\n"); 
     } 
     else 
     { 
      detected_face_count ++; // increase detected_face_count 
      printf("FACE DETECTED !\n\n"); 
     } 

    } 
    printf("count of frames : %d \n", frame_count); 
    printf("count of frames has detected face : %d \n", detected_face_count); 
    printf("Face Found %d percent of frames!\n", (int)(100 * detected_face_count/frame_count)); 

    if((float)(detected_face_count/frame_count) > 0.89) 
    { 
     printf("FACES DETECTED over %90 of frames!\n\n"); 
    } 
    return (0); 
} 
+0

Большое спасибо. это сработало! могу ли я спросить, как преобразовать код в C++ api? – CubbyBluePen

+0

То же самое с использованием opencv 3.1 и opencv 2.4.10? Потому что я использовал opencv 2.4.10 – CubbyBluePen

+0

, который вы можете проверить для компиляции. если вы не можете компилировать, дайте мне знать. – sturkmen

Смежные вопросы