OpenCV的VideoCapture ::打开视频源对话框

时间:2013-12-19 20:34:46

标签: c++ opencv ffmpeg libavcodec libav

在我当前的项目中,当我调用VideoCapture :: open(camera device index)并且相机被另一个程序使用时,它会显示一个Video Source对话框并在我选择一个设备时返回true已经在使用中。

但是,在我的[之前]实验项目中,当我调用VideoCapture :: open(camera device index)时,它不会显示此对话框。

我想知道导致Video Source对话框显示的原因以及程序与实验项目的行为不同。

这是实验项目的源代码:

int main (int argc, char *argv[])
{

    //vars
    time_duration td, td1;
    ptime nextFrameTimestamp, currentFrameTimestamp, initialLoopTimestamp, finalLoopTimestamp;
    int delayFound = 0;
    int totalDelay= 0;

    // initialize capture on default source
    VideoCapture capture;
    std::cout << "capture.open(0): " << capture.open(0) << std::endl;
    std::cout << "NOOO" << std::endl;
    namedWindow("video", 1);

    // set framerate to record and capture at
    int framerate = 15;

    // Get the properties from the camera
    double width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
    double height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);

    // print camera frame size
    //cout << "Camera properties\n";
    //cout << "width = " << width << endl <<"height = "<< height << endl;

    // Create a matrix to keep the retrieved frame
    Mat frame;

    // Create the video writer
    VideoWriter video("capture.avi",0, framerate, cvSize((int)width,(int)height) );

    // initialize initial timestamps
    nextFrameTimestamp = microsec_clock::local_time();
    currentFrameTimestamp = nextFrameTimestamp;
    td = (currentFrameTimestamp - nextFrameTimestamp);

    // start thread to begin capture and populate Mat frame
    boost::thread captureThread(captureFunc, &frame, &capture);
    // loop infinitely
    for(bool q=true;q;)
    {
        if(frame.empty()){continue;}
        //if(cvWaitKey( 5 ) == 'q'){ q=false; }
        // wait for X microseconds until 1second/framerate time has passed after previous frame write
        while(td.total_microseconds() < 1000000/framerate){
            //determine current elapsed time
            currentFrameTimestamp = microsec_clock::local_time();
            td = (currentFrameTimestamp - nextFrameTimestamp);
            if(cvWaitKey( 5 ) == 'q'){
                std::cout << "B" << std::endl;
                q=false;
                boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(0);
                captureThread.timed_join(timeout);
                break;
            }
        }

        // determine time at start of write
        initialLoopTimestamp = microsec_clock::local_time();

        // Save frame to video
        video << frame;
        imshow("video", frame);

        //write previous and current frame timestamp to console
        cout << nextFrameTimestamp << " " << currentFrameTimestamp << " ";

        // add 1second/framerate time for next loop pause
        nextFrameTimestamp = nextFrameTimestamp + microsec(1000000/framerate);

        // reset time_duration so while loop engages
        td = (currentFrameTimestamp - nextFrameTimestamp);

        //determine and print out delay in ms, should be less than 1000/FPS
        //occasionally, if delay is larger than said value, correction will occur
        //if delay is consistently larger than said value, then CPU is not powerful
        // enough to capture/decompress/record/compress that fast.
        finalLoopTimestamp = microsec_clock::local_time();
        td1 = (finalLoopTimestamp - initialLoopTimestamp);
        delayFound = td1.total_milliseconds();
        cout << delayFound << endl;

        //output will be in following format
        //[TIMESTAMP OF PREVIOUS FRAME] [TIMESTAMP OF NEW FRAME] [TIME DELAY OF WRITING]
        if(!q || cvWaitKey( 5 ) == 'q'){
            std::cout << "C" << std::endl;
            q=false;
            boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(0);
            captureThread.timed_join(timeout);
            break;
        }
    }

    // Exit
    return 0;
}

Video Source Dialog

0 个答案:

没有答案