您的位置:首页 > 其它

yuv图像的存储和rgb图像的存储

2018-01-12 09:38 2356 查看
读取一张rgb图像
cv::Mat src = cv::imread("a.jpg", 1);

在opencv中会产生颜色相反的结果,所以使用之前转一下颜色
cvtColor(src, src, CV_RGB2BGR);

我们需要用大小为3*width*height字节的数组来存放一张 width*height大小的rgb图像
unsigned char* rgb = new unsigned char[src.cols*src.rows*3];

注意src.cols就是width,src.rows就是height
如果是想用来保存yuv的话,就需要大小是src.cols*src.rows*3/2个字节的数组
unsigned char* yuv= new unsigned char[src.cols*src.rows*3/2];

注意3/2一定不要写到最前面
unsigned char * dst_y = yuv ;
unsigned char * dst_u = yuv + src.cols*src.rows;
unsigned char * dst_v = dst_u + src.cols*src.rows/4;

假设现在我们通过rgb2yuv已经将yuv数据装载到这个yuv首地址的数组里了,我们来获得这个yuv的文件
std::FILE *f = NULL;
f = std::fopen("/data/dstall.yuv", "w+");
std::fwrite(yuvall, sizeof(char), src.rows * src.cols * 3/2, f);

现在我们想要通过显示一张rgb图像的方式来查看一个yuv文件的Y,U,V分布,于是我们先来定制这张图像的大小
cv::Mat dstall = cv::Mat(src.rows*3/2, src.cols, CV_8U, yuv);

src.rows*3/2是指这张图像的高度的字节大小,src.cols是这张图像的宽度字节大小,要得到YUV图像分布,需要采用

单通道CV_8U,yuv对应的图像数据源地址。
如果我们是想获得一张显示图像的rgb图像呢.我们可以这样做
cv::Mat cv::Mat dstRGB = cv::Mat(src.rows, src.cols, CV_8U3, rgbaddr);

最后将这个图片保存起来
cv::imwrite("dest.png",dstRGB );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  yuv rgb 图像 imwrite imread