有没有更好的方法来命名 `cv::mat` 变量
Is there a better way to named pipe a `cv::mat` variable
我正在尝试将一个 cv::mat
变量从一个 C 程序传递到另一个,它们彼此独立。
我已经创建了一个来自论坛和搜索的基本代码,我有 2 个程序,writer.c
和 reader.c
。
writer.c
中有一个 cv::mat img
变量,我需要将其通过管道传输到 reader.c
cv::mat img
以显示 imshow()
;
我正在合并来自多个来源的代码希望这项工作,因为我可以找到一个工作示例
我的消息来源:
https://unix.stackexchange.com/questions/222075/pipe-named-fifo
这是我到现在为止的进化:
文件中的代码 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: %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;
}
我没有从这段代码中得到任何错误,但是,我没有得到 Image ether
没有 window 似乎要创建以显示图像。
有什么帮助吗?
有什么可以帮助我通过的吗?
有什么方向吗?
谢谢
已在 https://answers.opencv.org/question/216274/is-there-a-better-way-to-named-pipe-a-cvmat-variable/
中解决
已解决Here
只需根据图像大小更改缓冲区大小
我正在尝试将一个 cv::mat
变量从一个 C 程序传递到另一个,它们彼此独立。
我已经创建了一个来自论坛和搜索的基本代码,我有 2 个程序,writer.c
和 reader.c
。
writer.c
中有一个 cv::mat img
变量,我需要将其通过管道传输到 reader.c
cv::mat img
以显示 imshow()
;
我正在合并来自多个来源的代码希望这项工作,因为我可以找到一个工作示例
我的消息来源:
https://unix.stackexchange.com/questions/222075/pipe-named-fifo
这是我到现在为止的进化:
文件中的代码 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: %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;
}
我没有从这段代码中得到任何错误,但是,我没有得到 Image ether 没有 window 似乎要创建以显示图像。
有什么帮助吗? 有什么可以帮助我通过的吗? 有什么方向吗?
谢谢
已在 https://answers.opencv.org/question/216274/is-there-a-better-way-to-named-pipe-a-cvmat-variable/
中解决已解决Here
只需根据图像大小更改缓冲区大小