Writing opencv mat to stdout

Writing opencv mat to stdout

本文关键字:stdout to mat opencv Writing      更新时间:2023-10-16

我正试图将一个处理过的mat写入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/

imreadimdecode相关,而imwriteimencode相关。

你可以把imread想象成:

  1. 按原样读取图像文件(jpg、png等)中的原始数据缓冲区
  2. 使用imdecode将原始数据缓冲区解码为(通常,但取决于标志)BGR图像

CCD_ 7为

  1. 使用imencode将(通常)BGR图像解码为jpg、png等原始数据缓冲区
  2. 按原样将原始数据缓冲区写入磁盘

原始数据缓冲区是一个CCD_ 9。

根据您的需要,您可以安装stdout:

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

关于图像操作的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;