OpenCV,无法为长记录释放 CAP_OPENCV_MJPEG VideoWriter

Posted

技术标签:

【中文标题】OpenCV,无法为长记录释放 CAP_OPENCV_MJPEG VideoWriter【英文标题】:OpenCV, can't release CAP_OPENCV_MJPEG VideoWriter for long records 【发布时间】:2020-12-18 14:15:07 【问题描述】:

您好 *** 社区, 我最近遇到了 opencv VideoWriter (see here) 的性能问题,我现在使用 cv::CAP_OPENCV_MJPEG 作为后端,而不是 cv::CAP_FFMPEG。 现在我正在运行另一个问题,所以我的代码如下所示:

cv::VideoWriter videoWriter(path, cv::CAP_OPENCV_MJPEG, fourcc, fps, *size);
videoWriter.set(cv::VIDEOWRITER_PROP_QUALITY, 100);

int id = metaDataWriter.insertNow(path);

while (this->isRunning) 

    while (!this->stackFrames.empty()) 

        cv:Mat m = this->stackFrames.pop();

        videoWriter << m;
    



videoWriter.release();

此循环在单独的线程中运行,“isRunning”将从外部切换。有一个带有 cv::Mat (stackFrames) 的堆栈,该堆栈由另一个线程填充,该线程通过视频捕获卡捕获图像。这工作正常,但如果文件大小太大,几 GB,调用 videoWriter.release() 时会出现以下错误:

在抛出 'cv::Exception' 的实例后调用终止 什么():OpenCV(4.4.0)/home/michael-gary/opencv/opencv/modules/videoio/src/container_avi.cpp:27:错误:(-211:其中一个参数的值超出范围)无法写入 AVI 文件:块大小超出函数 'safe_int_cast' 的范围

我尝试将视频容器从 .avi 更改为 .mkv、.mp4、.mpg,但它们都不起作用,甚至没有创建文件。只有 .avi 正在工作,但在发布时失败。 现在我将尝试编写多个文件,所以我不会遇到这个问题,但我想自己面对问题。 欢迎提出任何建议

BR迈克尔

【问题讨论】:

【参考方案1】:

AVI 文件的大小实际上有限

当你强制它使用OPENCV_MJPEG时,它只会使用OpenCV自己的写法,只能做AVI和MJPEG。

如果您需要不同的容器,则必须使用不同的后端,例如 FFMPEG。您仍然可以使用 MJPG 作为编解码器 (fourcc)。

【讨论】:

以上是关于OpenCV,无法为长记录释放 CAP_OPENCV_MJPEG VideoWriter的主要内容,如果未能解决你的问题,请参考以下文章

opencv资源释放问题

opencv中如何将从视频中抓取的帧释放掉

如何检测 OpenCV 中何时释放密钥?

opencv mat转 iplimage 需要释放内存吗

OpenCV Mat中的动态内存释放错误

在opencv中 我新建了一个Mat 类型的变量,怎么释放他??如下。