问题描述
我正在从我的相机中抓取图像并使用 C++ 对其进行一些图像处理。问题是我无法知道我的 fps 精确度,因为我的图像处理不稳定(在 25 到 40 毫秒之间振荡)。因此,当我在视频编写器中添加帧时,视频的最后速度太快了。所以我降低了 videowriter.open 中的 fps,但由于我的图像处理时间不稳定,视频速度出现波动。
有人有什么建议可以制作正常速度的视频吗? 除了opencv的videowriter之外,我还必须使用其他东西吗?
提前致谢
我的一部分代码是:
cv::Mat ImgRAW;
cv::Mat oResultImg;
std::shared_ptr< cv::VideoWriter> m_pVideoWriter = nullptr;
m_pVideoWriter = std::make_shared<cv::VideoWriter>();
fFramerate = 20;
pVideoWriter->open(strPathName,cv::VideoWriter::fourcc('m','p','4','v'),fFramerate,size,true);
While (IsGrabbing)
{
doProcessing(ImgRaw,oResultImg);
if (yRecordVideo)
{
oVideowriter.AddFrame(oResultImg);
cv::waitKey(25);
}
}
oVideowriter.release();
解决方法
将图像抓取和处理分离可能是明智的。有一个专门的线程,每 N 秒抓取一次图像,并在中间休眠。另一个线程处理图像。如果落后太多,则将一帧写入两次并跳过下一帧的处理。
或者,如果可能,您可以离线进行处理