在 openCV 中快速将图像保存到磁盘
Posted
技术标签:
【中文标题】在 openCV 中快速将图像保存到磁盘【英文标题】:Fast saving of images to disk in openCV 【发布时间】:2017-11-27 14:19:11 【问题描述】:我正在使用 Basler 相机,想尽快将我以 1000x1000 像素抓取的图像写入磁盘。 保持电影容器打开并保存为 .avi 并没有真正帮助(减慢 2 倍),保存单个图像甚至更慢。 我目前正在使用 openCV cvVideoCreator 和 imwrite 函数。 我的电脑应该足够快(Intel Xeon 3.6 GHz、64GB RAM、SSD)。 有什么想法吗?
【问题讨论】:
未压缩和压缩图像的典型尺寸是多少(以及压缩需要多长时间)?你使用什么帧率?您的硬盘的可持续传输率是多少?上面的数字有意义吗? 什么是“cvVideoCreator”?快速搜索没有任何有用的结果。 对数据的表示方式有什么要求吗?彩色还是单色?我认为压缩(如果有的话)应该是无损的? 什么对你来说快?每秒200帧? 30 ? 5?还有,你现在的速度是多少? 1000 x 1000 像素并不是一个巨大的图像,在这样的 pc 配置下,您应该使用 imwrite 实现快速的速度......这又回到了一个问题,什么对你来说是快速的? 如果是彩色相机,最好能捕捉原始 (Bayer) 图像(在去马赛克完成之前)。这些是单通道,因此如果将它们存储在该状态下,则可以将数据量减少到 1/3。 |当然,在单独的线程中运行的捕获和存储是有一定道理的。 【参考方案1】:为了达到您的目标(以 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 上写入 BMP 格式,因为其编码时间几乎为零(例如,小于 0.3 毫秒)
在单独的线程中执行上述一些步骤(例如,编码或文件关闭)。
特别是,文件关闭是一个很好的候选,可以在单独的线程中运行,因为它可以与其他步骤异步完成。使用第二个选项、BMP 文件格式和更好的硬盘,我能够达到 400 MB/s 的保存带宽。
希望这对您和其他有类似目标的人有所帮助。
【讨论】:
【参考方案2】:您在问题中陈述的规格与您处理和缓冲数据的能力有关,但与您可以转储到磁盘的速度无关。
您正在尝试编写(假设一些数字,只需替换为您自己的数字) 每秒 1000*1000(大小)* 4(数据/像素)* 25(帧速率)字节。 (或 100M/s)
这大约是传统 HDD 的极限,但如果磁盘碎片或满了,它就不太可能跟上。 因此,您必须找到一种方法来加快写入时间(例如切换到 SSD);减少正在写入的数据(压缩、降低颜色深度/质量/帧速率)或在后台线程保存到磁盘时缓冲您想要写入的内容。
您必须问的问题是您计划录制多长时间。如果它的时间不足以填满您的 RAM,那么您拥有所有可用的选项。但是,如果您打算长时间录制,则必须在其他 2 个中选择一个。
【讨论】:
可能每个像素 3 个字节,不像透明度与来自相机的图像相关。 @DanMašek 我想说这会有所不同,但我已经看到硬盘在 10M/s 写入方面遇到了困难……我确实说过这些值是假设的。跨度>以上是关于在 openCV 中快速将图像保存到磁盘的主要内容,如果未能解决你的问题,请参考以下文章