unsigned char* BGR2NV21(cv::Mat& Img,int Width,int Height){ int cols = Width; int rows = Height; int Yindex = 0; int UVindex = rows * cols; int isize = 1.5 * rows * cols; unsigned char* yuvbuff = new unsigned char[isize]; cv::Mat NV21(rows + rows / 2, cols, CV_8UC1); for (int i = 0; i<rows; i++) { for (int j = 0; j<cols; j++) { uchar* YPointer = NV21.ptr<uchar>(i); int B = Img.at<cv::Vec3b>(i, j)[0]; int G = Img.at<cv::Vec3b>(i, j)[1]; int R = Img.at<cv::Vec3b>(i, j)[2]; //计算Y的值 int Y = (77 * R + 150 * G + 29 * B) >> 8; YPointer[j] = Y; yuvbuff[Yindex++] = (Y < 0) ? 0 : ((Y > 255) ? 255 : Y); uchar* UVPointer = NV21.ptr<uchar>(rows + i / 2); //计算U、V的值,进行2x2的采样 if (i % 2 == 0 && (j) % 2 == 0) { int U = ((-44 * R - 87 * G + 131 * B) >> 8) + 128; int V = ((131 * R - 110 * G - 21 * B) >> 8) + 128; UVPointer[j] = V; UVPointer[j + 1] = U; yuvbuff[UVindex++] = (V < 0) ? 0 : ((V > 255) ? 255 : V); yuvbuff[UVindex++] = (U < 0) ? 0 : ((U > 255) ? 255 : U); } } } return yuvbuff;}