我喜欢使用至少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,如何更改为灰色图像?
答案 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,现在它可以工作。