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

标签 python numpy opencv

我正在用 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/

相关文章:

python - 为什么 sorted(set(A)) 比 set(sorted(A)) 快?

python - django postgresql 操作错误 : index row size xxx exceeds maximum yyy

python - 使用 SymPy/Python 进行部分分数分解

java - 如何根据感兴趣区域周围的设计去除图像的背景?

ios - 将16位 float 的MTLTexture转换为cv::Mat 32位 float 类型

python - python/opencv:如何通过给定图像上的点识别循环?

python - 如何在 Pandas 中获取数据框的列片

python - 什么 python 可以仅使用对象自己的标签来告诉我有关对象的信息?

python - 加速 NumPy 的 where 函数

python - 检查并索引 numpy 数组中的非唯一/重复值