簡體   English   中英

在 C/C++ 和 Python 之間共享內存

[英]Share memory between C/C++ and Python

有沒有辦法共享內存以在 C/C++ 和 python 之間共享 openCV 圖像(C+++ 中的 MAT 和 python 中的 numpy)圖像? 不需要多平台,我在 linux 中做,我認為 mmap 或類似想法之間的共享。

我有兩個正在運行的進程,一個是用 C 編寫的,另一個是 python,我需要在它們之間共享一個圖像。

我將通過套接字從 c 進程調用 python,但我需要通過內存發送和圖像。

另一種選擇可能是寫入內存文件,不確定是否會更耗時。

好的,這並不是真正意義上的內存共享。 IPC想要將圖像數據從一個進程發送到另一個進程。

我建議您使用Unix命名管道。 您將必須以C / C ++的字符串格式獲取原始數據,通過管道或Unix套接字將其發送到Python,然后從發送的數據中獲取一個numpy數組。 也許使用np.fromstring()函數。

不用擔心速度,管道非常快。 本地和Unix套接字也是如此。 大多數時間將浪費在獲取字符串表示形式並將其返回矩陣上。

您可能會創建實際的共享內存空間,並將C / C ++中的OpenCV中的數據直接導入Python,然后在Python中使用OpenCV來獲取numpy數組,但這很復雜。 如果您不需要光速,最好的選擇就是管道。

這並不完全是您所要求的,但是您可以使用諸如 Redis 之類的內存數據庫作為在程序之間交換 OpenCV 圖像的管道。 雖然不如原始內存映射那么直接,並且雖然它引入了一個額外的應用層,但數據仍然嚴格地在 RAM 中操作。 根據我的經驗,這種策略足夠快,可以在現代機器上接近實時。

我已經將這種架構用於https://github.com/vmlaker/hello-websocket ,盡管它在兩端都使用 Python。

下面是一個使用 C++ 實現源代碼的類似協議的簡約示例,以及用於目標應用程序的 Python。 以下 C++ 程序使用 OpenCV 從磁盤文件中讀取圖像,並將圖像存儲在 Redis 中的 key 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_redishttps : //github.com/cpp-redis/cpp_redis

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM