2013-09-24 5 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

Смежные вопросы