如何使用共享内存共享 cv::Mat 以在 cpp 和 python 之间进行处理
How to share cv::Mat for processing between cpp and python using shared memory
我正在使用 boost/interprocess/ 提供的共享内存在模型和客户端(均为 C++)之间共享 cv::Mat。现在我需要使用 Python 中的模型。您能否告诉我在不更改当前客户端的情况下,在 C++ 和 Python 之间共享 cv::Mat 的最佳方式是什么?谢谢
使用映射内存完成任务以在 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()
我正在使用 boost/interprocess/ 提供的共享内存在模型和客户端(均为 C++)之间共享 cv::Mat。现在我需要使用 Python 中的模型。您能否告诉我在不更改当前客户端的情况下,在 C++ 和 Python 之间共享 cv::Mat 的最佳方式是什么?谢谢
使用映射内存完成任务以在 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()