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

asked 2019-07-28 06:32:29 -0600

dedetuga gravatar image

I'm trying to pipe a cv::mat variable from one C program to an other they are independent of each other. I already create a basic code sourced from forums and search, I have 2 programs, writer.c and reader.c. The writer.c have a cv::mat img variable in it and I need pipe it to reader.c cv::mat img to be showed up with imshow();

I'm merging code from multiple sources hoping this work, because I can find a working sample

My sources:

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

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

https://unix.stackexchange.com/questi...

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

This is my evolution until now:

Code from file 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;
}

Code from 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: %s\n", 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;
}

I got no errors from this code, but, I got no Image ether no window apear to be created to show the image.

Any help? Anything to help me passing through? Any direction?

thanks

edit retag flag offensive reopen merge delete

Closed for the following reason the question is answered, right answer was accepted by dedetuga
close date 2019-07-28 14:44:40.481621

Comments

sturkmen gravatar imagesturkmen ( 2019-07-28 06:48:14 -0600 )edit

Sorry, I don't say it, the OS is linux

dedetuga gravatar imagededetuga ( 2019-07-28 10:45:25 -0600 )edit

177*284*3 = 150804 bytes to transmit. yet you only read a single buffer of 1024 bytes.

and i think, your named pipes problems are of-topic here.

berak gravatar imageberak ( 2019-07-28 11:08:28 -0600 )edit

OMG!!!! I'm so embarrassing how I didn't see it!!!!??? I changed #define MAX_BUF 1024 to 150804 and everything start spontaneously working!!! Thanks @berak

dedetuga gravatar imagededetuga ( 2019-07-28 14:44:11 -0600 )edit