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

Reading camera image using raspistill from C++ program

我喜欢使用至少 60Hz 的 RPi 捕捉图像。我的代码是用 C++ 编写的,我们有一个用于 C++ 接口的库 here。但是那个库最大有 30Hz。 我的目标是最低 60 Hz。 到目前为止,我发现 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,如何改成灰度图?

我在 Raspberry Pi 3 上使用 hereRaspicam,在黑白模式下达到大约 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 配合使用非常好。

此外,我还没有时间看看创建一个新线程来处理每一帧是否工作得更快,或者让几个线程在开始时启动并使用条件变量在之后启动一个获取每一帧。

Mark Setchell 的回答是正确的。

但是我发现设置帧率参数在API级别没有暴露,无法设置帧率。默认帧速率为 30 Hz。 可以在 src/private/private_impl.cpp 文件中更改它。我设置为 60Hz,现在可以使用了。