快速节省图像到OpenCV中的磁盘
Fast saving of images to disk in openCV
我正在使用basler摄像头,想写我以1000x1000px抓取的图像,以尽快磁盘。保持电影容器的打开并保存为.avi并没有真正的帮助(减慢2倍),保存单个图像甚至较慢。我目前正在使用OPENCV CVVIDEORECOREATOR和IMWRITE功能。我的计算机应该足够快(Intel Xeon 3.6 GHz,64GB RAM,SSD)。有什么想法吗?
您可能需要考虑多个因素(步骤),以达到目标(保存50 fps或150 mb/s)的颜色图像(1k x 1k x 3)。
-
图像编码:大多数众所周知的图像格式,例如PNG,TIF,JPG花费时间来编码图像(例如,PNG的5.7 ms,tif在OpenCV中使用3.6 GHz 4核CPU中的TIF tif为11.5 ms)在将编码格式数据保存到磁盘之前,要达到特定格式。
-
文件打开:独立于文件大小,这可能需要时间(例如,在3.5" WD黑色上1.5 ms)
-
文件写作:文件大小的依赖,这可能需要时间(例如,3.5" WD黑色)
在2.0 ms上 文件关闭:文件大小的依赖,这可能需要大量时间(例如,3.5" WD黑色)14.0 ms)
这意味着您必须在每个图像中以20毫秒的目标完成所有步骤,并且正如我给出了时机的示例,您可能无法使用JPG中的OpenCV Imwrite来实现您的目标,因为该库会顺序完成所有上面的步骤中的一个线程。
我认为您有几个选择
-
imwrite在SSD上的BMP格式中,因为其编码时间实际上为零(例如,小于0.3 ms)
-
在单独的线程中执行上面的一些步骤(例如,编码或文件关闭)。
尤其是,文件关闭是在单独的线程中运行的一个很好的候选者,因为它可以与其他步骤进行异步进行。我能够使用第二个选项,BMP文件格式和更好的硬盘来达到400 MB/s的保存带宽。
希望这可以帮助您和其他具有类似目标的人。
您在问题中陈述的规格与您的处理和缓冲数据的能力有关,但与您可以转储到磁盘的速度无关。
您正在尝试编写(假定一些数字,只需替换自己)1000 * 1000(大小) * 4(数据/像素) * 25(帧速率)字节每秒。
(或100m/s)
这与传统的HDD的限制有关,但是如果磁盘分散或填充,则不太可能跟上。因此,您必须找到一种方法来加快写入时间(例如,切换到SSD);减少编写的数据(压缩,降低颜色深度/质量/帧速率)或缓冲您要编写的内容时,背景线程保存到磁盘时。
您必须问的问题是您打算录制多长时间。如果它不足以填充您的RAM,那么您可以使用所有可用的选项。但是,如果您打算延长时间记录,则必须选择其他2个。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- OpenCV Android C++ imwrite not found
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 快速节省图像到OpenCV中的磁盘
- 磁盘结构元素opencv与Matlab
- 如何从磁盘加载Jpeg图像并创建视频文件?Avi等),而无需在c++中使用opencv