Is there a better way to named pipe a `cv::mat` variable [closed]
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/...
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
see https://answers.opencv.org/question/1... if your OS is windows
Sorry, I don't say it, the OS is linux
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.
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