【发布时间】:2019-12-01 08:45:24
【问题描述】:
我正在 Python 中进行一些 快速 图像处理(使用 Numpy/Scipy + OpenCV)。 有几千张形状完全相同的图片 - 一旦我阅读了第一张,我就知道其他所有图片的样子。
问题在于读取每个下一张图像从磁盘会导致分配新内存(速度很慢)。有没有办法通过将下一张图片直接读入一些已经存在的内存(ndarray)来避免它?我知道 cv2.imdecode 在 C++ 中可以接受指向预分配 Mat 的指针,但它似乎没有 Python 绑定(唯一的选择是返回一个全新的数组)。
我需要这个用于多处理 - 我想将图像读入共享内存,然后在工作进程中对它们做一些繁重的工作。现在,我不得不将cv2.imread 分配和返回的数组中的数据复制到共享内存中,这又需要时间。我希望能够直接在那里写。
【问题讨论】:
-
这听起来像是对 OpenCV 有用的 PR。你使用什么文件格式?可能可以使用较低级别的库之一。
-
您是否有分析器数据表明您的瓶颈确实在于内存分配?如果是这样,为什么不慢慢将图像读入张量并将该张量缓存到磁盘?
-
@NilsWerner 不仅仅是内存分配成为瓶颈。它也是对子进程的复制,它对图像做一些工作——无论是在通过管道发送数据期间,还是在从 OpenCV 分配的缓冲区复制到共享内存期间。我想直接将数据读取到该共享内存中,一块石头杀死分配和复制鸟;)MadPhysicist 现在我正在使用PNG,但最终我希望有一种更通用的解决方案。跨度>
-
我也面临同样的问题。我想将帧捕获到预先分配的 numpy 数组中。你能分享我你的解决方案吗?现在,我必须编写一个 C 扩展来调用 C/C++ api,并包装一个接受 numpy 缓冲区指针的新函数。
-
没有人找到办法做到这一点??