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

标签 c++ opencv named-pipes

我需要将 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: %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);
  1. 打开命名管道(等待读取器出现)

  2. 读取opencv mat中的数据

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

  4. 将编码后的数据写入管道

关于c++ - 我可以将 cv::Mat 作为 JPEG 数据写入命名管道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36064471/

相关文章:

c# - Namedpipe 在发送大字符串时挂起

c++ - Abort() 已被调用 - Connect Function multithreads Cpp

c++ - 您可以将指针传递给 std::vector 的迭代器吗

opencv - 训练 Haar 级联只用了很少的时间

c++ - 无法在 Linux 中使用 OpenCV 打开相机

java - 在 OpenCV (openCv4Android) 中使用 Imgproc.calcHist 进行反投影(backgorund 减法)

c++ - 多态枚举

c++ - 这是文档中的一个小错误还是我遗漏了什么?

c - Linux : Creating a simple non-blocking server and client to communicate over named pipes

c# - 如何继续从命名管道/流发送/读取消息