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

读取一张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 );



你可能感兴趣的:(工具,camera)