将图像从 python 传输到 C++ 并返回

Posted

技术标签:

【中文标题】将图像从 python 传输到 C++ 并返回【英文标题】:Pipe image from python to C++ and back 【发布时间】:2019-07-12 09:22:37 【问题描述】:

我需要在 Python 中读取图像(使用 OpenCV),将其通过管道传输到 C++ 程序,然后将其通过管道传输回 Python。 到目前为止,这是我的代码:

C++

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cv.h>
#include <highgui.h>
#include <cstdio>

#include <sys/stat.h>

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) 
    const char *fifo_name = "fifo";
    mknod(fifo_name, S_IFIFO | 0666, 0);
    ifstream f(fifo_name);
    string line;
    getline(f, line);
    auto data_size = stoi(line);

    char *buf = new char[data_size];
    f.read(buf, data_size);

    Mat matimg;
    matimg = imdecode(Mat(1, data_size, CV_8UC1, buf), CV_LOAD_IMAGE_UNCHANGED);

    imshow("display", matimg);
    waitKey(0);

    return 0;

Python

import os
import cv2

fifo_name = 'fifo'

def main():
    data = cv2.imread('testimage.jpg').tobytes()
    try:
        os.mkfifo(fifo_name)
    except FileExistsError:
        pass
    with open(fifo_name, 'wb') as f:
        f.write('\n'.format(len(data)).encode())
        f.write(data)

if __name__ == '__main__':
    main()

当 C++ 尝试打印到图像时抛出异常。我已经调试了代码,buf被填满了,但是matimg是空的。

【问题讨论】:

【参考方案1】:

在代码中,C++ 阅读器调用mknod,而它应该只打开由 Python 编写器创建的现有命名管道。

如果读取器尝试打开时管道不存在,它可能会失败或继续尝试打开命名管道并超时。例如:

const char *fifo_name = "fifo";
std::ifstream f;
for(;;)  // Wait till the named pipe is available.
    f.open(fifo_name, std::ios_base::in);
    if(f.is_open())
        break;
    std::this_thread::sleep_for(std::chrono::seconds(3));

【讨论】:

读取成功。我已经将buf 的内容写在一个文件中,它的输出与python 的输出匹配到管道。问题是imdecode 没有成功解码图像。

以上是关于将图像从 python 传输到 C++ 并返回的主要内容,如果未能解决你的问题,请参考以下文章

将 C++ 数组发送到 Python 并返回(使用 Numpy 扩展 C++)

如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?

使用 Python+Stomp.py 和 ActiveMQ 发送/接收图像

使用python套接字编程将图像文件从服务器传输到客户端

如何将数组从 c++ 传递给 python 函数并将 python 返回的数组检索到 c++

将 Eigen 数组从 c++ 传输到 python 时的地址更改