网上都是yuv422转yuv420,很少有yuv420转yuv422。
本次从bgr转yuv420,然后基于yuv420转yuv422
int pixeltransform::bgr2yvyu422(cv::Mat srcimg, unsigned char *pdst)
{
//BGR To I420
cv::Mat dstimg;
cv::cvtColor(srcimg, dstimg, cv::COLOR_BGR2YUV_I420);
int width = srcimg.cols;
int height = srcimg.rows;
int nLenY = width * height;
int nLenU = nLenY / 4;
unsigned char *i420bytes = dstimg.data;
unsigned char *i420y = NULL;
i420y = (unsigned char *)malloc(width * height);
unsigned char *i420u = NULL;
i420u = (unsigned char *)malloc(width * height / 4);
unsigned char *i420v = NULL;
i420v = (unsigned char *)malloc(width * height / 4);
memcpy(i420y, i420bytes, nLenY); //Y
for (int i = 0; i < nLenU; i++) {
i420u[i] = i420bytes[nLenY + i]; //U
i420v[i] = i420bytes[nLenY + nLenU + i]; //V
}
int ySrcIndex = 0;
int uSrcIndex = 0;
int vSrcIndex = 0;
int yDstIndex = 0;
//I420 to YUYV
for (int i = 0; i < height / 2; i++) {
int uvWidth = width;
for (int k = 0; k < uvWidth / 2; k++) {
// Y
pdst[yDstIndex] = i420y[ySrcIndex];
pdst[yDstIndex + uvWidth * 2] = i420y[ySrcIndex + uvWidth];
yDstIndex++;
ySrcIndex++;
// U
pdst[yDstIndex] = i420u[uSrcIndex];
pdst[yDstIndex + uvWidth * 2] = i420u[uSrcIndex];
yDstIndex++;
// Y
pdst[yDstIndex] = i420y[ySrcIndex];
pdst[yDstIndex + uvWidth * 2] = i420y[ySrcIndex + uvWidth];
yDstIndex++;
ySrcIndex++;
// V
pdst[yDstIndex] = i420v[vSrcIndex];
pdst[yDstIndex + uvWidth * 2] = i420v[vSrcIndex];
yDstIndex++;
uSrcIndex += 1;
vSrcIndex += 1;
}
yDstIndex += uvWidth * 2;
ySrcIndex += uvWidth;
}
free(i420y);
free(i420u);
free(i420v);
return 0;
}