我正在用 Python(使用 Numpy/Scipy + OpenCV)进行一些快速图像处理。 有几千张形状完全相同的图片 - 一旦我读了第一张,我就确切地知道所有其他图片会是什么样子。
问题是从磁盘读取每个下一个图像会导致分配新内存(这很慢)。有没有办法通过将每个下一张图像直接读入一些已经存在的内存(ndarray
)来避免它?我知道cv2.imdecode它在 C++ 中可以接受指向预分配 Mat 的指针,但它似乎没有 Python 绑定(bind)(唯一的选择是返回一个全新的数组)。
我需要这个进行多处理——我想将图像读入共享内存,然后在工作进程中对它们做一些繁重的工作。现在我被迫从 cv2.imread 分配和返回的数组中复制数据进入共享内存,这又需要时间。我希望能够直接在那里写信。
最佳答案
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")
通过寻址每个图像的维度,python 将尝试将给定数组存储到现有数组中。这导致对预分配内存区域的内存分配。如果数组的形状不同,则会引发 ValueError。 当只提到变量名时,会创建一个新的数组引用,从而在内存中产生一个新对象(cf ids)
关于python - 将图像读取到预先分配的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57161866/