检测到对象时捕获帧

时间:2016-05-15 19:11:50

标签: c++ opencv face-detection

我有以下代码:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;


String object_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier object_cascade;
string window_name = "Capture - detector";

int main( void )
{
    VideoCapture capture;
    Mat frame;

    std::vector<Rect> objects;
    Mat frame_gray;

    if( !object_cascade.load( object_cascade_name ) ){ std::cout << "ERROR: Cascade not loaded!\n" ; return -1; };

    capture.open( 0 );
    if( capture.isOpened() ){
        for(;;){
            capture >> frame;
            capture.retrieve(frame);
            //-- 3. Apply the classifier to the frame
            if( !frame.empty() ){
                // Start

                cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
                equalizeHist( frame_gray, frame_gray );
                //-- Detect Object
                object_cascade.detectMultiScale( frame_gray, objects, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

                for( size_t i = 0; i < objects.size(); i++ ){
                    Point pt1 = Point( objects[i].x, objects[i].y );
                    Point pt2 = Point( objects[i].x + objects[i].width, objects[i].y + objects[i].height );
                    rectangle( frame, pt1, pt2, Scalar( 34, 92, 241 ), 2, 8, 0 );

                    Mat faceROI = frame_gray( objects[i] );
                }
                //-- Show what you got
                imshow( window_name, frame );

                // End
            }
            else{ std::cout << "ERROR: frame.empty returns 1!"; break; }
            int c = waitKey(10);
            if( (char)c == 'c' ) { break; }

        }
    }
    return 0;
}

从内置网络摄像头播放视频并检测面部,我的想法是我希望视频在检测到对象面时停止,然后显示一个窗口,其中仅包含来自最后一帧的检测到的对象。

0 个答案:

没有答案