虽然不完全符合您的要求,但您可以使用内存数据库(例如Redis)作为在程序之间交换OpenCV图像的通道。虽然比原始内存映射方式更间接,并且引入了额外的应用层,但数据仍然严格在RAM中操作。根据我的经验,这种策略在现代计算机上足够快,接近实时。
我曾经在https://github.com/vmlaker/hello-websocket中使用过这样的架构,尽管两端都使用Python。
以下是一个类似协议的最简示例,其中源代码使用C++编写,目标应用程序使用Python。下面的C++程序使用OpenCV从磁盘文件中读取图像,并将该图像存储在Redis中的键image
下:
#include <opencv4/opencv2/opencv.hpp>
#include <cpp_redis/cpp_redis>
int main(int argc, char** argv)
{
cv::Mat image = cv::imread("input.jpg");
std::vector<uchar> buf;
cv::imencode(".jpg", image, buf);
cpp_redis::client client;
client.connect();
client.set("image", {buf.begin(), buf.end()});
client.sync_commit();
}
然后在Python中,您可以从数据库中获取图像并根据需要进行操作:
import cv2
import numpy as np
import redis
store = redis.Redis()
image = store.get('image')
array = np.frombuffer(image, np.uint8)
decoded = cv2.imdecode(array, flags=1)
cv2.imshow('hello', decoded)
cv2.waitKey()
反过来也很简单。你可以在这里获取cpp_redis
:https://github.com/cpp-redis/cpp_redis。