Ejemplo n.º 1
0
/*    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;
}
Ejemplo n.º 2
0
//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);
	}
}