- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在从 YUV420 解码器捕获原始输出。我得到了三个指针:分别是 Y(1920*1080)、U(960*540) 和 V(960*540)。
我想使用 OpenCV 将图像保存为 JPEG。我尝试使用opencv的cvtcolor
cv::Mat i_image(cv::Size(columns, rows), CV_8UC3, dataBuffer);
cv::Mat i_image_BGR(cv::Size(columns, rows), CV_8UC3);
cvtColor(i_image, i_image_BGR, cv::COLOR_YCrCb2BGR);
cv::imwrite("/data/data/org.myproject.debug/files/pic1.jpg", i_image_BGR);
但是,这是保存的输出图像:
有人可以建议保存图像的正确方法是什么吗?
最佳答案
以下是将提供的YUV文件转换为RGB图像的过程。
请注意,调整大小步骤只是重复 U 和 V 值的一种优化方式。这仅在 Y 在两个维度上的分辨率是 U 和 V 的两倍的情况下有效.这种方法应该对任意大小的图像无效(未测试)。
这是上述过程的代码。
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
std::vector<unsigned char> readBytesFromFile(const char* filename)
{
std::vector<unsigned char> result;
FILE* f = fopen(filename, "rb");
fseek(f, 0, SEEK_END); // Jump to the end of the file
long length = ftell(f); // Get the current byte offset in the file
rewind(f); // Jump back to the beginning of the file
result.resize(length);
char* ptr = reinterpret_cast<char*>(&(result[0]));
fread(ptr, length, 1, f); // Read in the entire file
fclose(f); // Close the file
return result;
}
int main(int argc, char** argv)
{
cv::Size actual_size(1920, 1080);
cv::Size half_size(960, 540);
//Read y, u and v in bytes arrays
auto y_buffer = readBytesFromFile("ypixel.bin");
auto u_buffer = readBytesFromFile("upixel.bin");
auto v_buffer = readBytesFromFile("vpixel.bin");
cv::Mat y(actual_size, CV_8UC1, y_buffer.data());
cv::Mat u(half_size, CV_8UC1, u_buffer.data());
cv::Mat v(half_size, CV_8UC1, v_buffer.data());
cv::Mat u_resized, v_resized;
cv::resize(u, u_resized, actual_size, 0, 0, cv::INTER_NEAREST); //repeat u values 4 times
cv::resize(v, v_resized, actual_size, 0, 0, cv::INTER_NEAREST); //repeat v values 4 times
cv::Mat yuv;
std::vector<cv::Mat> yuv_channels = { y, u_resized, v_resized };
cv::merge(yuv_channels, yuv);
cv::Mat bgr;
cv::cvtColor(yuv, bgr, cv::COLOR_YUV2BGR);
cv::imwrite("bgr.jpg", bgr);
return 0;
}
使用以下命令编译和测试:
g++ -o yuv2rgb -std=c++11 yuv2rgb.cpp -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc
执行上述代码生成如下输出图像:
关于c++ - YUV420 从像素指针到 BGR 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50230188/
例如,我有 4*4 图像。我想分别提取 Y、U 和 V 分量。如果图像是 YUV 422 ,YUV 420 和 YUV444 怎么办。我有兴趣了解数组的结构 Y、U 和 V 如何存储在 422,420
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我无法理解两者之间的确切区别。从研究中,更多地讨论这两者是不同的,但似乎有一些人将它们归为“4 2 2”抽样方案。 YUV 422(I 和 J 版本):“具有一个亮度平面 Y 和 2 个色度平面 U、
我有 10 个 yuv 输入,每个 yuv 都是 WxH 的帧(ip0_WxH.yuv,ip1_WxH.yuv,...,ip9_WxH.yuv) 我需要连接所有 10 个以创建一个包含所有 10 个帧
我的目标是将我解码的帧写入文件中。我知道我捕捉得很好,因为它显示在我的 SDL 播放中,并且我随后对其进行编码,没有任何问题。但似乎我无法将框架正确写入文件。这是代码: #define PIXFMT
我用ffmpeg做HDR测试视频,我的做法是写一张图片,把图片转成yuv420p,然后用ffmpeg做HDR测试视频。 但我发现从 mp4 读取的 yuv 数据与原始输入不同.. 我在这里被困了一段时
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们
我一直在尝试用 C++ 将 YUYV 原始文件转换为 YUV420 原始文件。格式记录在 YUV Formats Page 中.转换后我的输出文件显示为绿色。我采用了来自 Experts Exchan
我正在尝试通过 python 使用 OpenCV 4.1.0 版将平面 YUV 4:2:0 图像转换为 RGB,并且正在努力了解如何格式化数组以传递给 cvtColor 功能。我将所有 3 个 cha
我正在编写一个医疗应用程序,其中有来自 IP 接口(interface)的数据包。其中对像素骨架解码有以下定义。我可以决定在主框架中选择什么来使用不同的像素算法。但我没有正确理解逻辑。 这三种格式是什
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 1年前关闭。 Improve thi
我得到 YUV 到 RGB 函数 1 和 2(来自堆栈溢出) 但是结果是这样的错误http://163.18.62.32/device.jpg 我不明白这一步有什么问题 我的设备是 Moto Mile
我正在使用opencv来实现对象跟踪。我读到 YUV 图像比 RGB 图像更好用。我的问题是,尽管我花了很多时间阅读笔记,但我还是无法理解 YUV 格式。 Y 是亮度,我认为它是根据 R、G、B 分量
我有高清1920x1080 YUV 格式视频。 我想将它们压缩到 640x480和其他转换为其他格式(mp4/avi..) 我使用了以下命令: ffmpeg -f rawvideo -pix_fmt
我正在使用 FFMPEG 从 MXF 视频中提取图像。我有兴趣使用 YUV(最好是 422)颜色空间提取 tiff 格式的图像。 MXF 视频属于 YUV 颜色空间。因此,为什么我想继续在那个色彩空间
我有一个 YUV 文件,我想以 BMP 文件的形式获取每一帧,该怎么做?我可以使用 FFMPEG 和 MPlayer。 最佳答案 您可以使用以下命令: ffmpeg -s widthxheight -
如何从 YUV 视频文件格式中获取信息?我需要了解有关流的信息(例如编解码器、位深度)。使用 ffplay 我可以播放 yuv 视频,但如何获取有关流的信息? 我尝试使用 ffprobe 但它不起作用
我试图将 C++ 程序中生成的数组中的原始 YUV 帧流式传输到使用 FFPEG 的视频。谁能指出我正确的方向? 最佳答案 要将管道 YUV420 平面帧流式传输到 RTMP,请尝试例如 ffmpeg
我有一个要实时流式传输到屏幕的 YUV 数据流(来自视频文件)。 (基本上,我想写一个实时播放视频的程序。) 因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我希望使用可移植的东
我已经通过用 Nvidia 的着色器语言编写的片段着色器实现了 YUV 到 RGB 的转换。 (Y、U 和 V 存储在单独的纹理中,这些纹理通过我的片段着色器中的多纹理组合而成)。它在 OpenGL
我是一名优秀的程序员,十分优秀!