2013-09-24 47 views
4

我試圖創建一個函數,該函數在調用該函數時給出幀。所以當我調用這個函數的時候,它應該給出這個函數被調用時攝像機前面的對象的圖片。OpenCV - 抓取幀的函數

我一直在嘗試幾個小時,但我不能成功。任何人?

主要文件:

#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; 
    } 
}; 
+0

現在玩這個。它似乎正確捕捉圖像,如果我慢慢地通過(在調試模式)。但是,我注意到OpenCV窗口變得奇怪的名字。我認爲內存在某種程度上被損壞了。 – escapecharacter

回答

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秒鐘的睡眠似乎可靠,但這是不可接受的。如果我在第一次grabFrame()調用之前沒有給它任何睡眠,那麼我添加的while循環似乎只運行兩次。

貸記到:https://stackoverflow.com/a/9285151/2518451