写opencv mat到stdout

时间:2016-05-06 14:06:00

标签: c++ opencv stdout

我正在尝试将已处理的垫子写入STDOUT,以便我可以将其输入ffmpeg,但我无法理解它们之间的区别是什么

imencode和imread。

根据opencv文档

imencode : Encodes an image into a memory buffer.

imread : Loads an image from a file.

是不是imread将图像数据加载到内存缓冲区中?可以将opencv窗口传送到另一个应用程序吗?

而不是使用raspvid我想管道ffmpeg我的程序的输出,这将是显示已处理窗口的窗口。

http://www.valmueller.net/stream-video-with-raspberry-pi-to-youtube/

2 个答案:

答案 0 :(得分:0)

imreadimdecode相关,而imwriteimencode相关。

您可以将imread视为:

  1. 从图像文件中读取 as-is 原始数据缓冲区(jpg,png等...)
  2. 使用imdecode将原始数据缓冲区解码为(通常,但取决于标志)BGR图像。
  3. imwrite是:

    1. 使用imencode解码为jpg,png等...(通常)BGR图像到原始数据缓冲区。
    2. 将原始数据缓冲区按原样写入磁盘。
    3. 原始数据缓冲区是vector<uchar>

      根据您的需要,您可以加入stdout

      • (通常)BGR缓冲区,其包含字节序列BGRBGR ... BGR。字节数组从mat.data开始,长度等于:mat.rows * mat.cols * mat.channels()。这对连续矩阵有效,但我们假设现在就是这种情况。
      • 解码 jpg,png等...原始数据缓冲区

答案 1 :(得分:0)

Operations with Images 上的 OpenCV 教程提到虽然 imread/imwrite 可用于读取和写入文件,但... > <块引用>

使用 cv::imdecodecv::imencode 从内存而不是文件读取和写入图像。

因此,由于我们要将结果推送到标准输出,因此需要使用 imencode 将矩阵数据保存在缓冲区中(此处假设为 JPEG 文件格式):

cv::Mat fileToSend = # initialised somehow
std::vector<uchar> buffer;
cv::imencode(".jpg", fileToSend, buffer);

然后将缓冲区数据写入标准输出:

std::fwrite(buffer.data(), 1, buffer.size(), stdout);
std::fflush(stdout);
return 0;