我可以将 cv::Mat 作为 JPEG 数据写入命名管道吗?

Can I write a cv::Mat as JPEG data to a named pipe?

本文关键字:管道 数据 cv Mat 作为 JPEG 我可以      更新时间:2023-10-16

我需要将JPEG形式的图像数据写入Linux中的命名管道(使用mkfifo创建)。

但是我找不到一种方法来解决这个问题。 我可以用imwrite写入普通文件,但不能写入此 FIFO。

法典:

img = cv::Mat(cv::Size(videoWidth, videoHeight), CV_8UC3, videoBuffer);
cv::namedWindow("Display window", cv::WINDOW_NORMAL);
cv::imshow("Display window", img); // Show our image inside it.            
cv::imwrite("image.jpg", img);

如何使用命名管道而不是文件?

我找到了解决方案。

//using namespace cv; // do not use opencv namespace, because of the write method
// open named pipe
if ((fifo = open(outPipe.c_str(), O_WRONLY)) < 0) {
    printf("Fifo error: %sn", strerror(errno));
    return 1;
}
cv::Mat img = cv::Mat(cv::Size(videoWidth, videoHeight), CV_8UC3, videoBuffer); // videoBuffer directly from libav transcode to memory      
cv::namedWindow("Display window", cv::WINDOW_NORMAL); // Create a window for display.
cv::imshow("Display window", img); // Show our image inside it.            
// encode image to jpeg
std::vector<uchar> buff; //buffer for coding
std::vector<int> param(2);
param[0] = cv::IMWRITE_JPEG_QUALITY;
param[1] = 95; //default(95) 0-100
cv::imencode(".jpg", img, buff, param);
printf("Image data size: %lu bytes (%d kB)n", buff.size(), (int) (buff.size() / 1024));
// write encoded image to pipe/fifo
if (write(fifo, buff.data(), buff.size()) < 0) {
    printf("Error write image data to fifo!n");
}
close(fifo);
  1. 打开命名管道(等待读取器存在)

  2. 读取 opencv 垫中的数据

  3. 将 opencv mat 图像编码为 jpeg 格式

  4. 将编码数据写入管道