如何使用共享内存在 cpp 和 python 之间共享 cv::Mat 以进行处理

Posted

技术标签:

【中文标题】如何使用共享内存在 cpp 和 python 之间共享 cv::Mat 以进行处理【英文标题】:How to share cv::Mat for processing between cpp and python using shared memory 【发布时间】:2021-12-16 01:26:15 【问题描述】:

我正在使用 boost/interprocess/ 提供的共享内存在模型和客户端(均为 C++)之间共享 cv::Mat。现在我需要在 Python 中使用模型。您能否告诉在 C++ 和 Python 之间共享 cv::Mat 而不更改当前客户端的最佳方式。谢谢。

【问题讨论】:

你的平台是什么?因为共享内存可能是特定于平台的。 这可能是help @LouisGo 我在 Windows 10 中工作。 Multiprocessing.shared_memory 似乎很适合你。 @LouisGo 感谢 cmets。我将检查 multiprocessing.shared_memory。目前我能够使用映射内存来解决它。 【参考方案1】:

使用映射内存在 C++ 和 Python 进程之间共享 cv::Mat 完成了任务。

C++ - 使用 boost 将 cv::Mat 复制到映射的共享内存中
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/windows_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <opencv2/opencv.hpp>

using namespace boost::interprocess;

int main(int argc, char* argv[])

imgMat= cv::imread("image.jpg");

windows_shared_memory shmem(open_or_create, "shm", read_write, img_size);

mapped_region region(shmem, read_write);

unsigned char* img_ptr = static_cast<unsigned char*> (region.get_address());

std::memcpy(img_ptr , imgMat.data, img_size);

std::system("pause");

Python - 使用 mmap 从内存中读取图像。
import mmap
import cv2 as cv
import numpy as np

if __name__ == '__main__':
  shmem = mmap.mmap(-1, image_size ,"shm")
  shmem.seek(0)
  buf = shmem.read(image_size)
  img = np.frombuffer(buf, dtype=np.uint8).reshape(shape)
  cv.imwrite("img.png", img)
  shmem.close()

【讨论】:

以上是关于如何使用共享内存在 cpp 和 python 之间共享 cv::Mat 以进行处理的主要内容,如果未能解决你的问题,请参考以下文章

如何查看哪些进程在使用共享内存

如何使用 mmap 在用户空间和内核之间共享内存并且数据没有文件支持

lutorpy 用于 python 和 torch 之间的共享内存

如何在python和C / C ++中使用共享内存

如何在工作在同一共享内存区域的两个进程之间共享锁?

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?