【问题标题】:Exchange data(images) between c++ client and python server在 C++ 客户端和 Python 服务器之间交换数据(图像)
【发布时间】:2019-12-23 07:16:28
【问题描述】:

嗨,我正在从事一个 AI 项目,我编写了一个 python 代码,它将训练和加载模型并给出预测,为了性能,我用 c++ 编写了后端的其余部分。

我曾想过将整个 python 代码重新编写成 c++,但没有成功,所以我想如果让 python 代码作为服务器运行会更容易,而 c++ 代码将作为客户端,c++客户端向python服务器提供图像,服务器将返回带有预测图像的c++客户端,整个过程将在同一个系统中。

通常我会选择套接字,但由于服务器和客户端都在同一个系统中,我认为必须有更好的解决方案。我正在使用 ubuntu。

TLDT;在同一系统中的两个程序之间交换数据(图像)最快的方法是什么(ubuntu OS)

【问题讨论】:

  • 您必须在这里定义“最佳”的含义,因为所有不同的方法都有其优点和缺点。使用套接字并没有错,但在某些情况下管道可能“更好”。
  • 好的,你是对的,我会编辑我的问题,谢谢你让问题变得更好
  • 考虑使用 Redis,然后您可以让多个客户端和服务器在多台机器上并行工作。它非常简单而且非常快。您还可以通过命令行轻松了解它以进行调试。客户端可用于 Python、C++、PHP、Ruby、bash...
  • 非常感谢您提供的示例,我将对其进行研究

标签: python c++ ubuntu-18.04


【解决方案1】:

一种选择是使用内存数据库(例如 Redis)在两个应用程序之间交换图像。例如,以下 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()

上面的 C++ 示例使用了cpp_redis 库,该库位于https://github.com/cpp-redis/cpp_redis

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2013-02-09
    • 2018-09-14
    • 2017-09-07
    • 1970-01-01
    • 2020-11-28
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多