4

関数が呼び出された瞬間にフレームを与える関数を作成しようとしています。したがって、関数を呼び出すと、関数が呼び出された時点でカメラの前にあるオブジェクトの画像が表示されます。

私は何時間も試みてきましたが、成功することはできません。誰?

メインファイル:

#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;
    }
};
4

1 に答える 1

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ループは2回しか実行されないようです。

クレジット: https://stackoverflow.com/a/9285151/2518451

于 2013-09-24T23:13:20.083 に答える