有没有更好的方法来命名管道`cv :: mat`变量

Is there a better way to named pipe a `cv::mat` variable

本文关键字:cv mat 变量 管道 更好 方法 有没有      更新时间:2023-10-16

我正在尝试将cv::mat变量从一个C程序中输送到另一个c程序。

我已经创建了一个从论坛和搜索中采购的基本代码,我有2个程序writer.creader.c

writer.c中有一个 cv::mat img变量,我需要将其管带到 reader.c cv::mat img,以用 imshow();

显示

我正在从多个来源中合并代码,希望这项工作,因为我可以找到一个有效的示例

我的来源:

https://stackoverflow.com/a/2789967/11632453

https://stackoverflow.com/a/30274548/11632453

https://unix.stackexchange.com/questions/222075/pipe-named-fifo

https://stackoverflow.com/a/36080965/11632453

这是我到目前为止的进化:

文件writer.c

代码
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;
int main()
{
    Mat img;
    img = imread("/home/filipe/Documentos/QT_Projects/FIFO_Writer/download.jpeg", CV_LOAD_IMAGE_COLOR);   // Read the file
    if(! img.data )                              // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", img );
    //waitKey(0); // Wait for a keystroke in the window
    //return 0;


    int fd;
    char * myfifo = "/tmp/myfifo";
    // create the FIFO (named pipe)
    mkfifo(myfifo, 0666);
    // write "Hi" to the FIFO
    fd = open(myfifo, O_WRONLY);
    //write(fd, "Hi", sizeof("Hi"));
    write(fd, img.data, sizeof(img.data));
    close(fd);
    // remove the FIFO
    unlink(myfifo);
    return 0;
}

reader.c

的代码
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
#define MAX_BUF 1024
int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";
    char buf[MAX_BUF];
    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);
    printf("Received: %sn", buf);
    close(fd);
    Mat img(177, 284, CV_8UC3, Scalar(0, 0, 0));
    img.data= ((unsigned char*) (buf));
    namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", img );
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

我没有此代码的错误,但是,我没有图像以太没有要创建显示图像的窗口apear。

有帮助吗?有什么可以帮助我经过的吗?有方向吗?

谢谢

在https://answers.opencv.org/question/216274/is-there-a-better-way-to-to-pipe-a-cipe-a-cvmat-variable/

在此处解决

只需根据图像大小

更改缓冲区sizer