OpenCV - 抓取框架的功能

时间:2013-09-24 21:48:07

标签: opencv video-capture

我正在尝试创建一个函数,在调用函数时给出框架。因此,当我调用该函数时,它应该在调用函数时给出摄像机前面对象的图片。

我已经尝试了几个小时,但我不能成功。任何人吗?

主文件:

#include "camera.h"
#include <iostream>
#include <unistd.h>
int main(int argc, const char *argv[])
{
    Camera cam;

    cam.setVideoSource(0);

    cv::Mat image;
    cv::Mat image2;

    cam.openCamera();

    cam.grabFrame(image);  // grap first frame
    sleep(5);              // wait 5 seconds
    cam.grabFrame(image2); // capture seconds frame

    cv::namedWindow("1",CV_WINDOW_KEEPRATIO);
    cv::imshow("1",image);

    cv::namedWindow("2",CV_WINDOW_KEEPRATIO);
    cv::imshow("2",image2);

    cv::waitKey();
    return 0;
}

camera.h文件

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

class Camera{
  private:
    int videoSource;    //video source
    cv::VideoCapture cap;   //capture of camera


  public:
    //constructor default videoSourceNumber 
    Camera() : videoSource(0) {};

    //Setter: videoSourceNumber
    void setVideoSource(int sourceNumber){
        videoSource = sourceNumber;
    }


    //function OPEN CAMERA
    //opens the video capture
    //returns true if successfull
    bool openCamera() {
        cap.open(videoSource);

        if (!cap.isOpened()){
            std::cout << "---- Error ----" << std::endl;
            return false;
        }

        return true;
    }


    //function GRAB FRAME
    //grabs the frame of the video capture
    //returns true if successfull
    bool grabFrame(cv::Mat& cameraFrame){
        cap >> cameraFrame;

        if (cameraFrame.empty()){
            std::cout << "---- Error ----" << std::endl;
            return false;
        }   

        return true;
    }
};

1 个答案:

答案 0 :(得分:0)

有点不满意的解决方案:

//function GRAB FRAME
//grabs the frame of the video capture
//returns true if successfull
bool grabFrame(cv::Mat& cameraFrame){
    int attempts = 0;
    do {
        cap >> cameraFrame;
        attempts++;
    } while (cameraFrame.empty() && attempts < 10);

    if (cameraFrame.empty()){
        std::cout << "---- Error ----" << std::endl;
        return false;
    }   

    return true;
}

我也玩了一段时间,但找不到解决方案。我的直觉是在要求第一帧之前给相机更多的“热身”时间。 10秒的睡眠似乎可靠地完成,但这是不可接受的。如果我在第一次调用callFrame()之前没有给它任何睡眠,我添加的while循环似乎只运行了两次。

感谢:https://stackoverflow.com/a/9285151/2518451