使用raspistill从C++程序读取摄像头图像
问题描述:
我喜欢用RPi至少60Hz捕捉图像。我的代码是用C++编写的,我们有一个用于C++接口的库here。但是这个库的最大频率是30Hz。 我的目标是最低60赫兹。 到目前为止我发现的是raspistill可以达到90Hz,所以我试图将我的C++程序连接到raspistill代码。 我在这里找到了一个库PiCam,它与raspistll具有直接接口。不是很确定,它可以达到60Hz,我仍然试图测试它,并有几个问题。 我的查询是使用raspistill从C++程序读取摄像头图像
(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,我该如何更改为灰度图像?
答
我使用Raspicam从here在Raspberry Pi 3上,并在黑白模式下获得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,现在它工作。
是的,目前我使用的库,它有30Hz帧率最大。你有没有测试过90Hz fps?没有设置fps的配置。我的图像处理大约需要10ms,所以如果我从文件中读取图像,我可以达到100Hz。但我使用该库的640 x 480帧大小,我可以有30Hz的最大值。所以从相机读取对我来说是瓶颈。如何使用lbrary设置更高的fps? – batuman
我可以读取90+ fps。我不设定比率,我只是尽可能快地阅读相框。尝试读取1,000帧并测量时间 - 然后减去3秒的稳定时间。我大约14秒。 –
谢谢我将执行线程,拆分图像读取线程和处理线程。 – batuman