OpenCV VideoWriter帧率问题
OpenCV VideoWriter Framerate Issue
我正在尝试将1080p网络摄像头的视频录制到文件中。我在视频中设置了一个计时器,在每次试验中,视频播放器(我使用的是VLC)报告的时间戳都与视频中的时间不同步。它总是关闭几秒钟(通常视频内计时器比玩家报告的时间快)。
如下所示,我将c++程序设置为在一个线程中捕获视频,在另一个线程中录制。这是工作良好,因为我的CPU使用率是~200%(可能的最大值?)我用的是Macbook Air/OS X 10.8 @ 1.8 GHz英特尔酷睿i7。
我已经尝试将帧率更改为15fps,结果是非常断断续续/缓慢的视频。我也试过设置CV_CAP_PROP_FRAME_WIDTH
&CV_CAP_PROP_FRAME_HEIGHT
的分辨率较低,导致视频速度慢。看起来1080p @ 30fps可以产生稳定的视频,但它的播放速度仍然比预期的要快。我也试过把waitKey(10);
放在record << frame;
之后,但它没有影响任何东西。
关于如何使视频及时匹配有什么建议吗?
谢谢!将
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <boost/thread.hpp>
using namespace cv;
void captureFunc(Mat *frame, VideoCapture *capture){
for(;;){
// get a new frame from camera
(*capture) >> (*frame);
}
}
int main(int, char**)
{
VideoCapture capture(0); // open the default camera
if( !capture.isOpened() ) {
printf("Camera failed to open!n");
return -1;
}
capture.set(CV_CAP_PROP_FPS,30); //set capture rate to 30fps
Mat frame;
capture >> frame; // get first frame for size
// initialize recording of video
VideoWriter record("test.avi", CV_FOURCC('D','I','V','X'), 30, frame.size(), true);
if( !record.isOpened() ) {
printf("VideoWriter failed to open!n");
return -1;
}
boost::thread captureThread(captureFunc, &frame, &capture); //start capture thread
sleep(1); //just to make sure capture thread is ready
for(;;)
{
// add frame to recorded video
record << frame;
}
return 0;
}
经过一些调试,我解决了我的问题;这是一个问题与VideoWriter挑剔的速率帧被馈送到它。
你需要同步你的读和写函数。你的代码读起来尽可能快,写起来也尽可能快。您的输出视频可能看起来很慢,因为写入输出比读取输入更快(因为capture >>
正在等待您的相机),并且记录了几个相同的帧。
不等待或同步的写入意味着您可能会多次写入相同的内容(我认为这里正在发生),或者丢失帧。
如果你想保持线程,你可以,但你需要让你的写进程等待,直到有新的要写。
同样,为了避免丢失帧或写入损坏的帧,您需要读取进程等待直到写入完成,以便可以安全地覆盖frame
。
由于线程无论如何都需要彼此等待,所以线程根本没有什么意义。
我更愿意推荐这种更简单的方法:
for (;;) {
capture >> frame;
process(frame); // whatever smart you need
record << frame;
}
如果你需要并行性,你将需要更复杂的同步机制,也许你的帧需要某种fifo。
- 如何提高 OpenCV 实时检测器应用程序的帧率?
- C++ 如何设置精确的帧率限制?
- 提高Basler相机的帧率
- 低帧率,仅使用地图和小地图绘制 (SFML)
- OpenCV视频阅读慢帧率
- C++SDL帧率脉冲
- OpenGL帧率:与窗口大小的连接
- 在openCV中编写可变帧率视频
- 快板5线程影响帧率
- OpenCV VideoWriter帧率问题
- 如何找到视频的帧率使用c++ opencv 2.4.10
- 控制帧率
- 我如何获得和改变OGRE应用程序的帧率?
- OpenCV慢相机帧率
- 数学:无论帧率如何,都能平稳地减速
- 如何改变libav解码帧率
- 发行控制游戏帧率的c++
- OpenCV -从播放显著提高帧率
- OpenCV:低帧率的限制是什么?
- 将帧率提高到30 fps,并从AVT GigE相机获得bayerr8