/* the same with OpenCV */ static int CVT_RGB2YCrCb(const unsigned char *srcImg, int srcStep, unsigned char *dstImg, int dstStep, int width, int height) { #define fix(x,n) (int)((x)*(1 << (n)) + 0.5) #define yuvYr_32f 0.299f #define yuvYg_32f 0.587f #define yuvYb_32f 0.114f #define yuvCr_32f 0.713f #define yuvCb_32f 0.564f #define yuv_shift 14 #define yuvYr fix(yuvYr_32f,14) #define yuvYg fix(yuvYg_32f,14) #define yuvYb fix(yuvYb_32f,14) #define yuvCr fix(yuvCr_32f,14) #define yuvCb fix(yuvCb_32f,14) #define CV_CAST_8U(t) (unsigned char)(!((t) & ~255) ? (t) : (t) > 0 ? 255 : 0) #define CV_DESCALE(x,n) (((x) + (1 << ((n)-1))) >> (n)) #define yuv_descale(x) CV_DESCALE((x), 14) int res = -1; const unsigned char *pRGB = NULL; unsigned char *pYCrCb = NULL; int y, r, g, b, i,j; __SAM_BEGIN__; if ( (NULL == srcImg) || (NULL == dstImg)) EXIT; for (int i=0; i<height; i++) { pRGB = srcImg + i*srcStep; pYCrCb = dstImg + i*dstStep; for(j=0; j<width; j++) { b = pRGB[j*3+2]; r=pRGB[j*3]; y = yuv_descale(b*yuvYb + yuvYg*pRGB[j*3+1] + yuvYr*r); r = yuv_descale((r-y)*yuvCr) + 128; b = yuv_descale((b-y)*yuvCb) + 128; pYCrCb[j] = CV_CAST_8U(y); pYCrCb[j*3+1] = CV_CAST_8U(r); pYCrCb[j*3+1] = CV_CAST_8U(b); } } res = 0; __SAM_END__; return res; }
//void YUV2RGB(const unsigned char* Src, unsigned char* Dst, int size, int Y0=0, int U=1, int Y1=2, int V=3) void YUV2RGB(const unsigned char* Src, unsigned char* Dst, int Size, int Y0, int U, int Y1, int V) { int Y, Cr, Cb; int b, g, r; Size *= 2; // YUV¸¦ ±âÁØ for (int i = 0; i < Size; i += 4, Dst += 6 ) { Y = yuv_prescale(Src[i+Y0]); Cb = Src[i+U] - 128; Cr = Src[i+V] - 128; b = yuv_descale( Y + yuvBCb*Cb ); g = yuv_descale( Y + yuvGCr*Cr + yuvGCb*Cb ); r = yuv_descale( Y + yuvRCr*Cr ); Dst[0] = CV_CAST_8U(b); Dst[1] = CV_CAST_8U(g); Dst[2] = CV_CAST_8U(r); Y = yuv_prescale(Src[i+Y1]); Cb = Src[i+U] - 128; Cr = Src[i+V] - 128; b = yuv_descale( Y + yuvBCb*Cb ); g = yuv_descale( Y + yuvGCr*Cr + yuvGCb*Cb ); r = yuv_descale( Y + yuvRCr*Cr ); Dst[3] = CV_CAST_8U(b); Dst[4] = CV_CAST_8U(g); Dst[5] = CV_CAST_8U(r); } }