与 Python 共享 OpenCV C++ 对象

Share OpenCV C++ Object with Python

场景:

C++ 程序进程使用 OpenCV 捕获图像。 另一个进程,使用 Python 和 OpenCV 与第一个程序共享内存区域(使用 mmap)。

问题:

如何在 Python 进程中创建对共享内存区域中已存在的同一图像的引用? Python 过程中的这部分可以编写为 C 模块并导入到 Python.

为了我的特定需求,只有 C++ 进程创建和写入数据,而 Python 进程只读取(并处理)数据。

额外信息:

给定同一张图片,C++的data字段cv::Matnumpy.array是相等的(相同的大小和内容)。所以不需要转换。

由于语言已经分离了内存管理器,它可能必须使用一些外部同步(例如信号量)来避免一个进程使用另一个进程的释放区域。

我的问题是在 Python numpy.array 对象中创建数据字段指向共享内存中特定区域的对象。

以下选项可用于为预分配内存缓冲区创建 cv::Matnumpy.array header:

  • 对于cv::Mat,有一个constructor在预分配的内存上创建一个cv::Matheader(Mat的析构函数不会释放内存在这种情况下):

    cv::Mat(int rows, int cols, int type, void * data, size_t step = AUTO_STEP)

  • numpy array from buffer:

    numpy.frombuffer(buffer, dtype=float, count=- 1, offset=0, *, like=None)