1. unsigned char* BGR2NV21(cv::Mat& Img,int Width,int Height)
    2. {
    3. int cols = Width;
    4. int rows = Height;
    5. int Yindex = 0;
    6. int UVindex = rows * cols;
    7. int isize = 1.5 * rows * cols;
    8. unsigned char* yuvbuff = new unsigned char[isize];
    9. cv::Mat NV21(rows + rows / 2, cols, CV_8UC1);
    10. for (int i = 0; i<rows; i++)
    11. {
    12. for (int j = 0; j<cols; j++)
    13. {
    14. uchar* YPointer = NV21.ptr<uchar>(i);
    15. int B = Img.at<cv::Vec3b>(i, j)[0];
    16. int G = Img.at<cv::Vec3b>(i, j)[1];
    17. int R = Img.at<cv::Vec3b>(i, j)[2];
    18. //计算Y的值
    19. int Y = (77 * R + 150 * G + 29 * B) >> 8;
    20. YPointer[j] = Y;
    21. yuvbuff[Yindex++] = (Y < 0) ? 0 : ((Y > 255) ? 255 : Y);
    22. uchar* UVPointer = NV21.ptr<uchar>(rows + i / 2);
    23. //计算U、V的值,进行2x2的采样
    24. if (i % 2 == 0 && (j) % 2 == 0)
    25. {
    26. int U = ((-44 * R - 87 * G + 131 * B) >> 8) + 128;
    27. int V = ((131 * R - 110 * G - 21 * B) >> 8) + 128;
    28. UVPointer[j] = V;
    29. UVPointer[j + 1] = U;
    30. yuvbuff[UVindex++] = (V < 0) ? 0 : ((V > 255) ? 255 : V);
    31. yuvbuff[UVindex++] = (U < 0) ? 0 : ((U > 255) ? 255 : U);
    32. }
    33. }
    34. }
    35. return yuvbuff;
    36. }