2016-05-07 17 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

関連する問題