从 Raspicam 捕获慢帧率视频

Posted

技术标签:

【中文标题】从 Raspicam 捕获慢帧率视频【英文标题】:Slow Framerate Capturing Video from Raspicam 【发布时间】:2016-04-12 11:06:26 【问题描述】:

我正在尝试使用 Raspberry Pi 相机录制视频。我想用openCV来做录音,因为当我有这个工作时,我会做更多的处理。

我正在使用来自here 的 raspicam/raspicam_cv 库。我可以打开相机并读取 cv::Mat 并创建视频,但帧速率在 1-2 Hz 之间。

我的代码在这里:

#include <ctime> #include <iostream> #include <raspicam/raspicam_cv.h> #include <cstdio> using namespace std; int main ( int argc,char **argv ) time_t timer_begin,timer_end; raspicam::RaspiCam_Cv Camera; cv::Mat image; int nCount=100; cout<<"Opening Camera..."<<endl; if (!Camera.open()) cerr<<"Error opening the camera"<<endl;return -1; cout<<"Capturing "<<nCount<<" frames ...."<<endl; time ( &timer_begin ); cv::VideoWriter writer("Avideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, cv::Size(1280,960), true); for ( int i=0; i<nCount; i++ ) char name[32] = 0; Camera.grab(); Camera.retrieve ( image); writer.write(image); cout<<"Stop camera..."<<endl; Camera.release(); time ( &timer_end ); /* get current time; same as: timer = time(NULL) */ double secondsElapsed = difftime ( timer_end,timer_begin ); cout<< secondsElapsed<<" seconds for "<< nCount<<" frames : FPS = "<< ( float ) ( ( float ) ( nCount ) /secondsElapsed ) <<endl;

当我运行程序 raspivid 时,我可以看到似乎以 30 Hz 运行的视频,这是我想要实现的。

由于某种原因,我也只能使用 1280x960 尺寸使此代码工作。

如果有人能给我一些建议,那就太好了。

【问题讨论】:

请首先确定是哪一行导致速度变慢。例如,我会先将视频作者 writer.write(image); 注释掉,看看这对速度有何影响。 注释掉 writer.write(image) 会使视频精确到 10 Hz 请提供raspivid的cpp代码链接进行比较。 sourceforge.net/projects/raspicam/files/raspicam-0.1.3.zip/… 源代码中没有 rapisvid 文件/项目。你是说 raspicam_cv_test 吗? 【参考方案1】:

raspicam::RaspiCam_Cv的默认大小为1280*960,可以使用get获取:

double RaspiCam_Cv::get ( int propId );

例如:

Camera.get(CV_CAP_PROP_FRAME_WIDTH);
Camera.get(CV_CAP_PROP_FRAME_HEIGHT);

如果你想要其他尺寸,你可以使用set来设置:

bool RaspiCam_Cv::set ( int propId, double value );

例如:

Camera.set(CV_CAP_PROP_FRAME_WIDTH,640);
Camera.set(CV_CAP_PROP_FRAME_HEIGHT,480);

其他可以获取/设置的属性包括:

 * CV_CAP_PROP_FRAME_WIDTH,CV_CAP_PROP_FRAME_HEIGHT,
 * CV_CAP_PROP_FORMAT: CV_8UC1 or CV_8UC3
 * CV_CAP_PROP_BRIGHTNESS: [0,100]
 * CV_CAP_PROP_CONTRAST: [0,100]
 * CV_CAP_PROP_SATURATION: [0,100]
 * CV_CAP_PROP_GAIN: (iso): [0,100]
 * CV_CAP_PROP_EXPOSURE: -1 auto. [1,100] shutter speed from 0 to 33ms
 * CV_CAP_PROP_WHITE_BALANCE_RED_V : [1,100] -1 auto whitebalance
 * CV_CAP_PROP_WHITE_BALANCE_BLUE_U : [1,100] -1 auto whitebalance
 * CV_CAP_PROP_MODE : [1,7] 0 auto mode

PS:cv::VideoWriter的FPS和大小必须与raspicam::RaspiCam_Cv相同,否则cv::VideoWriter将永远无法工作。

【讨论】:

以上是关于从 Raspicam 捕获慢帧率视频的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV VideoWriter 帧率问题

视频识别:SlowFast Networks

从 onCameraFrame、OpenCV、Android/Java 调用 HoughCircles() 方法时改变慢帧速率

学术论文丨视频识别SlowFast Networks

OpenCV C++ 多线程提高帧率

一部无损的25分钟帧率为23的720P视频应该多大