我正在尝试将已处理的垫子写入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/
答案 0 :(得分:0)
imread
与imdecode
相关,而imwrite
与imencode
相关。
您可以将imread
视为:
imdecode
将原始数据缓冲区解码为(通常,但取决于标志)BGR图像。而imwrite
是:
imencode
解码为jpg,png等...(通常)BGR图像到原始数据缓冲区。原始数据缓冲区是vector<uchar>
。
根据您的需要,您可以加入stdout
:
mat.data
开始,长度等于:mat.rows * mat.cols * mat.channels()
。这对连续矩阵有效,但我们假设现在就是这种情况。答案 1 :(得分:0)
Operations with Images 上的 OpenCV 教程提到虽然 imread
/imwrite
可用于读取和写入文件,但... >
<块引用>
使用 cv::imdecode
和 cv::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;