小编use*_*367的帖子

为什么opencv videowriter这么慢?

大家好,stackoverflow 社区,我遇到了一个棘手的问题,我需要您的帮助来了解这里发生的情况。我的程序从视频采集卡(Blackmagic)捕获帧,到目前为止,它工作得很好,同时我用 opencv (cv::imshow)显示捕获的图像,它也工作得很好(但相当浪费CPU)。捕获的图像也应该存储在磁盘上,为此我将捕获的帧(cv::Mat)放在堆栈上,最后将它们与 opencv 异步写入:

cv::VideoWriter videoWriter(path, cv::CAP_FFMPEG, 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();
Run Code Online (Sandbox Code Playgroud)

该代码正在另一个线程中运行,将从外部停止。到目前为止,代码可以正常工作,但有时速度相当慢,这意味着我的堆栈大小增加,我的系统耗尽内存并被操作系统杀死。

目前它正在我的开发系统上运行:

  • Ubuntu 18.04.05
  • OpenCV 4.4.0用Cuda编译
  • 英特尔 i7 10. 代 32GB RAM、GPU Nvidia p620、M.2 SSD

根据编解码器 (fourcc),这会产生较高的 CPU 负载。到目前为止我主要使用“MJPG”、“x264”。有时,甚至 MJPG 也会将 CPU 的一个核心调至 100% 负载,并且我的堆栈会一直升高,直到程序运行完毕。有时,重新启动后,此问题会得到解决,并且负载似乎分布在所有核心上。

关于英特尔文档。对于我的 CPU,它集成了多个编解码器的硬件编码/解码。但我猜 opencv 没有使用它们。Opencv 甚至使用它自己的 ffmpeg,而不是我的系统。这是我的 opencv 构建命令:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D WITH_CUDA=ON \ …
Run Code Online (Sandbox Code Playgroud)

c++ linux opencv ffmpeg

2
推荐指数
1
解决办法
6951
查看次数

标签 统计

c++ ×1

ffmpeg ×1

linux ×1

opencv ×1