代码基本上使用的都是OpenCV的库函数 和 C++的库函数,通用性比较强,可直接拿去使用。
1.介绍
一个宽高为 w*h 的图像,如果将它保存在设备上,使用RGB编码占用的内存字节数为w*h*3,使用RGB编码占用的内存字节数为w*h*3+w*h/4+w*h/4 = w*h*3/2.
YUV有很多编码格式,YUV420就是其中一种,而NV21又是YUV420中的一种。
2.代码
代码基本上使用的都是OpenCV的库函数 和 C++的库函数,通用性比较强,可直接拿去使用。
OpenCV没有提供直接从RGB转YUV_NV21/YUV_NV21的函数,所以需要间接转
1. RGB to YUV_NV21
//YUV_I420 to YUV_NV21
void Mat_I420ToNV21(const Mat& src, Mat& _dst)
{
Mat dst(src.size(), src.type());
int w = src.cols;
int h = src.rows * 2 / 3;
memcpy(dst.data, src.data, w * h);
Mat srcU(h / 2, w / 2, CV_8U, src.data + w * h);
Mat srcV(h / 2, w / 2, CV_8U, srcU.data + srcU.cols * srcU.rows);
vector<Mat> mats;
mats.push_back(srcV); //先V
mats.push_back(srcU); //后U
Mat srcUV;
merge(mats, srcUV);
memcpy(dst.data + w * h, srcUV.data, w * h /2);
_dst = dst;
}
//RGB to YUV_NV21
void Mat_RGBToYUV_NV21(const Mat& src, Mat& dst)
{
Mat img_i420;
cvtColor(src, img_i420, COLOR_BGR2YUV_I420); //色彩空间转换,RGB先转为YUV_I420
Mat_I420ToNV21(img_i420, dst); //调用YUV_I420 to YUV_NV21
}
2. RGB to YUV_NV12
//YUV_I420 to YUV_NV12
void Mat_I420ToNV12(const Mat& src, Mat& _dst)
{
Mat dst(src.size(),src.type());
int w = src.cols;
int h = src.rows * 2 / 3;
memcpy(dst.data, src.data, w * h);
Mat srcU(h / 2, w / 2,CV_8U, src.data + w * h);
Mat srcV(h / 2, w / 2,CV_8U, srcU.data + srcU.cols * srcU.rows);
vector<Mat> mats;
mats.push_back(srcU); //先U
mats.push_back(srcV); //后V
Mat srcUV;
merge(mats, srcUV);
memcpy(dst.data + w * h, srcUV.data, w * h / 2);
_dst = dst;
}
//RGB to YUV_NV12
void Mat_RGBToYUV_NV12(const Mat& src, Mat& dst)
{
Mat img_i420;
cvtColor(src, img_i420, COLOR_BGR2YUV_I420); //色彩空间转换,RGB先转为YUV_I420
Mat_I420ToNV21(img_i420, dst); //调用YUV_I420 to YUV_NV12
}
3. 用法
//1.RGB转YUV_NV21,直接调用下面函数
Mat_RGBToYUV_NV21(RGB_img, YUV_img);
//2.RGB转YUV_NV12,直接调用下面函数
Mat_RGBToYUV_NV12(RGB_img, YUV_img);
4. YUV_I420转RGB,直接用OpenCV提供的函数
cvtColor(srcYUV, RGB_img, COLOR_YUV2RGB_I420)
5. YUV_NV12/YUV_NV21转RGB,直接用OpenCV提供的函数
cvtColor(srcYUV, RGB_img, COLOR_YUV2RGB_NV12);
cvtColor(srcYUV, RGB_img, COLOR_YUV2RGB_NV21);
标签:src,Mat,img,dst,YUV,RGB,互转 来源: https://blog.csdn.net/xiaozhidian/article/details/120208580
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。