C++ 在openCV中快速将图像保存到磁盘

C++ 在openCV中快速将图像保存到磁盘,c++,opencv,video-capture,C++,Opencv,Video Capture,我使用的是Basler相机,我想把我以1000x1000px的速度抓取的图像尽快写入磁盘。 保持电影容器打开并另存为.avi并没有真正的帮助(速度降低2倍),保存单个图像甚至更慢。 我目前正在使用openCV cvVideoCreator和imwrite函数。 我的电脑应该足够快(Intel Xeon 3.6 GHz,64GB RAM,SSD)。 有什么想法吗?您在问题中陈述的规格与您处理和缓冲数据的能力有关,但与您可以转储到磁盘的速度无关 您正在尝试写(假设一些数字,只需替换为您自己的数字)

我使用的是Basler相机,我想把我以1000x1000px的速度抓取的图像尽快写入磁盘。 保持电影容器打开并另存为.avi并没有真正的帮助(速度降低2倍),保存单个图像甚至更慢。 我目前正在使用openCV cvVideoCreator和imwrite函数。 我的电脑应该足够快(Intel Xeon 3.6 GHz,64GB RAM,SSD)。
有什么想法吗?

您在问题中陈述的规格与您处理和缓冲数据的能力有关,但与您可以转储到磁盘的速度无关

您正在尝试写(假设一些数字,只需替换为您自己的数字) 每秒1000*1000(大小)*4(数据/像素)*25(帧速率)字节。
(或100米/秒)

这大约是传统HDD的极限,但如果磁盘碎片或已满,它就不可能跟上。 因此,您必须找到一种方法来加快写入时间(例如切换到SSD);减少正在写入的数据(压缩、颜色深度/质量/帧速率降低)或在后台线程保存到磁盘时缓冲要写入的内容


你必须问的问题是你计划录制多长时间。如果它不够长,无法填满内存,那么您就有了所有可用的选项。但是,如果你计划记录一段较长的时间,那么你必须选择其他2个。

< P>有很多因素(步骤)你可能需要考虑以达到你的目标(保存彩色图像(1K×1K×3),有50个FPS或150 Mb/s)。p>
  • 图像编码:大多数众所周知的图像格式,如png、tif、jpg,即使在将编码格式数据保存到磁盘之前,也需要时间将图像编码为特定格式(例如,在OpenCV中,png为5.7毫秒,tif为11.5毫秒,使用3.6 GHz 4核CPU)

  • 文件打开:独立于文件大小,这可能需要时间(例如,在3.5英寸WD黑色上为1.5毫秒)

  • 文件写入:取决于文件大小,这可能需要时间(例如,3.5英寸WD黑色上为2.0毫秒)

  • 文件关闭:取决于文件大小,这可能需要很多时间(例如,在3.5英寸WD黑色上为14.0毫秒)

  • 这意味着您必须在每个图像20毫秒内完成目标的所有步骤,正如我给出的计时示例所示,您可能无法使用JPG中的OpenCV imwrite实现目标,因为库在单个线程中顺序执行上述所有步骤

    我想你有两个选择

  • 在SSD上写入BMP格式,因为其编码时间几乎为零(例如,小于0.3毫秒)

  • 在单独的线程中执行上面的一些步骤(例如,编码或文件关闭)

  • 特别是,文件关闭是在单独线程中运行的一个很好的选择,因为它可以与其他步骤异步完成。使用第二个选项BMP文件格式和更好的硬盘,我能够达到400 MB/s的保存带宽


    希望这能帮助您和其他有类似目标的人。

    未压缩和压缩图像的典型尺寸是多少(压缩需要多长时间)?您使用的帧速率是多少?硬盘的可持续传输速率是多少?上述数字有意义吗?什么是“cvVideoCreator”"? 快速搜索不会得到有用的结果。对数据的表示方式有何要求?彩色还是单色?我假设压缩(如果有的话)应该是无损的?对你来说什么是快速的?每秒200帧?30 ? 5.还有,你现在的速度是多少?1000 x 1000像素并不是一个巨大的图像,在这样的pc配置下,您应该可以通过imwrite实现更快的速度。。。这又是一个问题,什么对你来说是最快的呢?对于彩色相机来说,你最好能捕捉原始(拜耳)图像(在去干扰之前)。这些都是单通道的,因此如果将数据存储在该状态,则可以将数据量减少到1/3当然,在不同的线程中运行的捕获和存储是有点给定的。每个像素可能有3个字节,不像透明度与来自相机的图像相关。@DanMašek我想说这会有所不同,但我看到硬盘在10M/s的写入速度下挣扎。。。我确实说过这些值是假设的。