2016-05-07 1 views
-1

Я разработал код. Проблема в том, когда я конвертирую ее в реальном времени, она не переходит к окончательному решению. Что я должен добавить, чтобы код перешел к окончательному решению? Я хочу, чтобы он читал код и давал результат кадр за кадром всего за 30 секунд, затем он переходит к окончательному решению. Может кто-нибудь мне помочь?Как перейти к окончательному решению в режиме реального времени?

int main(int argc,char** argv) 
{ 
    VideoCapture capture(0); 
    Mat frame,resize_blur_Img,fgmaskMOG,binaryImg; 
    Ptr<BackgroundSubtractor>pMOG; 
    pMOG = new BackgroundSubtractorMOG(); 
    int frame_count=0; 
    int detected_face_count = 0; 
    int detected_motion_count = 0; 
    CascadeClassifier cascade; 
    if (!cascade.load("C:/opencv2410/sources/data/haarcascades/haarcascade_frontalface_alt.xml")) 
    { 
     cerr << "ERROR: Could not load classifier cascade" << endl; 
     return -1; 
    } 
    Mat element = getStructuringElement(MORPH_RECT, Size(7, 7), Point(3, 3)); 

    while (true) 
    { 
     //MOTION DETECTION 
     if (!(capture.read(frame))) 
      break; 
     frame_count++; 
     resize(frame, resize_blur_Img, Size(frame.size().width, frame.size().height)); 
     pMOG->operator()(resize_blur_Img, fgmaskMOG, -1); 
     threshold(binaryImg, binaryImg, 128, 255, CV_THRESH_BINARY); 
     int TotalNumberOfPixels = fgmaskMOG.rows*fgmaskMOG.cols; 

     //FACE DETECTION 
     capture >> frame; 
     if (frame.empty()) 
      break; 

     imshow("original", frame); 
     vector<Rect>faces; 
     cascade.detectMultiScale(frame, faces, 1.1, 4, 0, Size(40, 50));//(const Mat& image, vector <Rect>& objects, double scaleFactor, int minNeighbors,int flags, Size minSize,Size maxSize) 

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

     imshow("MOTION DETECTION", fgmaskMOG); 
     imshow("FACE DETECTION", frame); 
     char c = waitKey(10); 

     printf("count of pixels: %d \n", countNonZero(fgmaskMOG)); 
     printf("%d Face Found !\n", faces.size()); 

     if (faces.size()>0 &&countNonZero(fgmaskMOG)>1) 
     { 
      detected_face_count++; 
      detected_motion_count++; 
      printf("FACE AND MOTION DETECTED !\n\n"); 
     } 
     else if (faces.size()>0 && countNonZero(fgmaskMOG)==0) 
     { 
      detected_face_count++; 
      printf("ONLY FACE DETECTED !\n\n"); 
     } 
     else if (faces.size() == 0 && countNonZero(fgmaskMOG) > 1) 
     { 
      detected_motion_count++; 
      printf("ONLY MOTION DETECTED !\n\n"); 
     } 
     else 
     { 
      printf("NOTHING DETECTED !\n\n"); 
     } 

//I want it to stop until here after 30 second and show the final decision according to rule below 

    } 

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

    //FINAL DECISION FROM ALL THE FRAME 
    if (((float)(detected_face_count/frame_count) > 0.49) && (((float)detected_motion_count/(float)frame_count)>0.19)) 
    { 
     printf("HUMAN DETECTED FROM BOTH DETECTION ! \n\n"); 
    } 
    else if (((float)detected_motion_count/(float)frame_count)>0.19) 
    { 
     printf("POSSIBLE HUMAN DETECTED FROM MOTION DETECTION ONLY !\n\n"); 
    } 
    else if ((float)(detected_face_count/frame_count) > 0.49) 
    { 
     printf("POSSIBLE HUMAN DETECTED FROM FACE DETECTION ONLY !\n\n"); 
    } 
    else 
    { 
     printf("HUMAN NOT DETECTED \n\n"); 
    } 

    getch(); 
} 
+0

Что вы подразумеваете под «сделать это в режиме реального времени»? Получение видео с живой камеры вместо записанного видео? Можете ли вы опубликовать минимальный пример своего кода? – sietschie

+0

Я редактировал код выше. – CBP

ответ

0

Если вы готовы включить импульс, есть точный, независимый от платформы способ сделать это:

#include <boost/date_time/posix_time/posix_time.hpp> 
namespace posixtime = boost::posix_time; 
... 
posixtime::ptime startTime = posixtime::microsec_clock::local_time(); 
while ((posixtime::microsec_clock::local_time() - start).total_seconds() < 30) 
{ 
    ... 

documentation Смотрите подробности. Конечно, есть множество способов сделать это, но я считаю это удобным.

+0

Может ли это быть более простой код? Я не могу запустить код, потому что у меня нет пути к файлу. – CBP

+1

, если у вас есть C++ 11, вы должны иметь библиотеку с теми же функциями – FKaria

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