将图像读取到预先分配的 numpy 数组

Prz*_*k D 5 python opencv numpy

我正在Python 中进行一些快速图像处理(使用 Numpy/Scipy + OpenCV)。有几千张形状完全相同的图像 - 一旦我读到第一张图像,我就确切地知道所有其他图像会是什么样子。

问题是从磁盘读取下一个图像会导致分配新内存(速度很慢)。有没有办法通过将每个下一个图像直接读入一些已经存在的内存()来避免这种情况?我知道cv2.imdecode在 C++ 中可以接受指向预分配 Mat 的指针,但它似乎没有 Python 绑定(唯一的选择是返回一个全新的数组)。ndarray

我需要这个来进行多重处理 - 我想将图像读入共享内存,然后在工作进程中对它们进行一些繁重的工作。现在,我被迫将cv2.imread分配和返回的数组中的数据复制到共享内存中,这又需要时间。我希望能够直接在那里写信。

小智 -1

height, width = (50, 50)
image = np.zeros((height, width))
id(image)
# outputs: 140411457307552
image[:, :] = np.ones((height, width))
id(image)
# outputs: 140411457307552
image = np.ones((height, width))
id(image)
# outputs -> 140411437723280

# when reading from disk (assuming your images are 50x50 pixels)
image[:, :] = cv2.imread("/home/.../your_im_50x50.png")
Run Code Online (Sandbox Code Playgroud)

通过解决每个图像的尺寸,Python 将尝试将给定的数组存储到现有的数组中。这导致内存分配到预分配的内存区域。如果数组没有相同的形状,则会引发 ValueError。当仅提及变量名时,将创建对数组的新引用,从而在内存中生成一个新对象(cf ids)