Hor*_*rst 5 c++ opencv video-capture
我正在使用 Basler 相机,并希望将我以 1000x1000px 抓取的图像尽快写入磁盘。保持影片容器打开并保存为 .avi 并没有真正的帮助(速度减慢 2 倍),并且保存单个图像甚至更慢。我目前正在使用 openCV cvVideoCreator 和 imwrite 函数。我的计算机应该足够快(Intel Xeon 3.6 GHz、64GB RAM、SSD)。有任何想法吗?
为了实现您的目标(以 50 FPS 或 150 MB/s 保存彩色图像 (1K x 1K x 3)),您可能需要考虑多个因素(步骤)。
图像编码:大多数众所周知的图像格式(例如 png、tif、jpg)需要时间(例如,在具有 3.6 GHz 4 核 CPU 的 OpenCV 中,png 为 5.7 ms,tif 为 11.5 ms)甚至之前就需要时间将图像编码为特定格式将编码格式数据保存到磁盘。
文件打开:与文件大小无关,这可能需要一些时间(例如,3.5" WD Black 上为 1.5 毫秒)
文件写入:取决于文件大小,这可能需要一些时间(例如,3.5" WD Black 上为 2.0 毫秒)
文件关闭:取决于文件大小,这可能需要很长时间(例如,3.5" WD Black 上为 14.0 毫秒)
这意味着您必须在每个图像 20 毫秒内完成所有步骤才能实现您的目标,正如我给出的计时示例一样,您可能无法使用 JPG 中的 OpenCV imwrite 来实现您的目标,因为库会按顺序执行上述所有步骤在单个线程中。
我认为你有几个选择
在 SSD 上 imwrite 为 BMP 格式,因为其编码时间几乎为零(例如,小于 0.3 毫秒)
在单独的线程中执行上述一些步骤(例如,编码或文件关闭)。
特别是,文件关闭非常适合在单独的线程中运行,因为它可以与其他步骤异步完成。使用第二个选项(BMP 文件格式)和更好的硬盘,我能够达到 400 MB/s 的保存带宽。
希望这对您和其他有类似目标的人有所帮助。
您在问题中陈述的规格与您处理和缓冲数据的能力有关,但与转储到磁盘的速度无关。
您正在尝试写入(假设的一些数字,只需替换为您自己的)1000*1000(大小)* 4(数据/像素)* 25(帧速率)字节每秒。
(或100M/s)
这大约是传统 HDD 的极限,但如果磁盘碎片或已满,则不太可能跟上。因此,您必须找到一种方法来加快写入时间(例如切换到 SSD);减少正在写入的数据(压缩、降低颜色深度/质量/帧速率)或在后台线程保存到磁盘时缓冲您想要写入的内容。
您必须问的问题是您计划录制多长时间。如果它不够长,无法填满您的 RAM,那么您可以使用所有选项。但是,如果您打算长时间录制,则必须选择其他 2 种之一。