BGR转YUN_NV12
各种数据结构下YUV分量在内存的分布如下图所示:
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
U U U U U U V V V V V V U V U V U V V U V U V U
V V V V V V U U U U U U U V U V U V V U V U V U
- I420 - - YV12 - - NV12 - - NV21 -
void convertYUV_I420toNV12(unsigned char* i420bytes, unsigned char* nv12bytes, int width, int height)
{
int nLenY = width * height;
int nLenU = nLenY / 4;
memcpy(nv12bytes, i420bytes, width * height);
for (int i = 0; i < nLenU; i++)
{
nv12bytes[nLenY + 2 * i] = i420bytes[nLenY + i]; // U
nv12bytes[nLenY + 2 * i + 1] = i420bytes[nLenY + nLenU + i]; // V
}
}
void BGR2YUV_nv12(cv::Mat &src, cv::Mat &dst)
{
int w_img = src.cols;
int h_img = src.rows;
dst = cv::Mat(h_img*1.5, w_img, CV_8UC1, cv::Scalar(0));
cv::Mat YUV_I420(h_img*1.5, w_img, CV_8UC1, cv::Scalar(0)); //YUV_I420
cv::cvtColor(src, YUV_I420, cv::COLOR_BGR2YUV_I420);
convertYUV_I420toNV12(YUV_I420.data, dst.data, w_img, h_img);
}