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

Posted

技术标签:

【中文标题】我可以将 cv::Mat 作为 JPEG 数据写入命名管道吗?【英文标题】:Can I write a cv::Mat as JPEG data to a named pipe? 【发布时间】:2016-03-17 15:07:34 【问题描述】:

我需要以 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);

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

【问题讨论】:

查看如何使用“imencode” 【参考方案1】:

我找到了解决方案。

//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: %s\n", 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);

    打开命名管道(等待读取器出现)

    读取opencv mat中的数据

    将opencv mat图像编码为jpeg格式

    将编码数据写入管道

【讨论】:

以上是关于我可以将 cv::Mat 作为 JPEG 数据写入命名管道吗?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3:如何将 cv::Mat 作为可选参数传递

如何直接在boost共享内存中编写opencv cv :: Mat图像

将 Cv::Mat 的数据存储在 std::vector 中

cv::Mat 类是不是存在设计缺陷?

合并两个 cv::Mat 而不复制数据

将一行 cv::Mat 转换为 std::vector