使用来自C ++程序的raspistill读取相机图像

时间:2017-01-03 09:29:19

标签: c++ raspberry-pi raspberry-pi2 raspberry-pi3

我喜欢使用至少60Hz的RPi捕捉图像。我的代码是用C ++编写的,我们有一个用于C ++接口的库here。但该库最大30Hz。 我的目标是最低60赫兹。 到目前为止,我发现raspistill可以达到90Hz,所以我试图将我的C ++程序与raspistill代码连接起来。 我在这里找到了一个库PiCam,它与raspistll有直接接口。不太确定,它可以达到60Hz,我仍然试图测试它并有一些问题。 我的疑问是

(1)如何使用C ++在RPi上获得60Hz fps?

(2)为了与PiCam接口,我已经编译,构建和安装了库,没有任何问题。 但是当我捕获时,我会得到黑色图像。可能是什么问题?我的代码的一部分如下所示。

CCamera* cam = StartCamera(640, 480,60,1,true);
    char mybuffer[640 * 480 * 4];
    int ret = cam->ReadFrame(0, mybuffer, sizeof(mybuffer));
    cout << " ret " << ret << endl;
    Mat img(480, 640, CV_8UC4,mybuffer);
    imwrite("img.jpg", img);

img.jpg用黑色图像拍摄。

(3)使用PiCam,如何更改为灰色图像?

2 个答案:

答案 0 :(得分:2)

我在Raspberry Pi 3上使用来自here Raspicam ,并在黑白模式下获得约90 fps。

我目前正在重新设计代码,因此它不是100%完美的满足您的需求,但应该让您前进。

#include <ctime>
#include <fstream>
#include <iostream>
#include <raspicam/raspicam.h>
#include <unistd.h> // for usleep()

using namespace std;

#define NFRAMES 1000
#define WIDTH   1280
#define HEIGHT  960

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

    raspicam::RaspiCam Camera;
    // Allowable values: RASPICAM_FORMAT_GRAY,RASPICAM_FORMAT_RGB,RASPICAM_FORMAT_BGR,RASPICAM_FORMAT_YUV420
    Camera.setFormat(raspicam::RASPICAM_FORMAT_GRAY);

    // Allowable widths: 320, 640, 1280
    // Allowable heights: 240, 480, 960
    // setCaptureSize(width,height)
    Camera.setCaptureSize(WIDTH,HEIGHT);

    // Open camera 
    cout<<"Opening Camera..."<<endl;
    if ( !Camera.open()) {cerr<<"Error opening camera"<<endl;return -1;}

    // Wait until camera stabilizes
    cout<<"Sleeping for 3 secs"<<endl;
    usleep(3000000);
    cout << "Grabbing " << NFRAMES << " frames" << endl;

    // Allocate memory for camera buffer
    unsigned long bytes=Camera.getImageBufferSize();
    cout << "Width: "  << Camera.getWidth() << endl;
    cout << "Height: " << Camera.getHeight() << endl;
    cout << "ImageBufferSize: " << bytes << endl;;
    unsigned char *data=new unsigned char[bytes];

    for(int frame=0;frame<NFRAMES;frame++){
       // Capture frame
       Camera.grab();

       // Extract the image
       Camera.retrieve (data,raspicam::RASPICAM_FORMAT_IGNORE);
       }
    }
    return 0;
}

顺便说一句,它与CImg非常吻合。

另外,我还没有时间看看它是否能够更快地创建一个新线程来处理每个帧,或者在开始时启动一些线程并使用条件变量来启动一个获取每一帧。

答案 1 :(得分:0)

Mark Setchell的回答是正确的。

但我发现设置帧速率参数不会在其API级别公开,并且无法设置帧速率。默认帧速率为30 Hz。 可以在src / private / private_impl.cpp文件中更改它。我设置为60Hz,现在它可以工作。