YUV回転IPLImage(RGB)
小さなプログラムで、ネットで長い間探していましたが、見つかりませんでした.
自分で一人やってみた
1つ目は愚かな方法です
yuvの3つの成分はそれぞれ3つのマトリクスの下に書いて、それから合併してrgb成分のピクチャフォーマットに変換すればいいです.
コードは次のとおりです.
もう一つの方法は複雑です
まず自分で原理に基づいてrgbフォーマットに変換します
そしてcvSetData()関数を用いてデータを書き込みIplImage形式のピクチャを生成する
まず、変換式を定義します.
yuv回転rgbの関数:
最後に、IplImageに書き込まれたコード:
プログラムはすべて実行されました
コンパイル環境vs 2008
opencv2.バージョン0
原帖住所:http://blog.csdn.net/dreamd1987/article/details/7259479
自分で一人やってみた
1つ目は愚かな方法です
yuvの3つの成分はそれぞれ3つのマトリクスの下に書いて、それから合併してrgb成分のピクチャフォーマットに変換すればいいです.
コードは次のとおりです.
IplImage *image,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;
rgbimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);
image = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);
yimg = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
uimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);
vimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);
uuimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
vvimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
cvSetData(yimg,pBuf, nWidth);
cvSetData(uimg,pBuf+nWidth*nHeight, nWidth/2);
cvSetData(vimg,pBuf+long(nWidth*nHeight*1.25), nWidth/2);
cvResize(uimg,uuimg,CV_INTER_LINEAR);
cvResize(vimg,vvimg,CV_INTER_LINEAR);
cvMerge(yimg,uuimg,vvimg,NULL,image);
cvCvtColor(image,rgbimg,CV_YCrCb2BGR);
もう一つの方法は複雑です
まず自分で原理に基づいてrgbフォーマットに変換します
そしてcvSetData()関数を用いてデータを書き込みIplImage形式のピクチャを生成する
まず、変換式を定義します.
#define MR(Y,U,V) (Y + (1.403)*(V-128))
#define MG(Y,U,V) (Y - (0.344) * (U-128) - (0.714) * (V-128) )
#define MB(Y,U,V) (Y + ((1.773) * (U-128)))
yuv回転rgbの関数:
void YUV420_C_RGB( char* pYUV, unsigned char* pRGB, int height, int width)
{
char* pY = pYUV;
char* pU = pYUV+height*width;
char* pV = pU+(height*width/4);
unsigned char* pBGR = NULL;
unsigned char R = 0;
unsigned char G = 0;
unsigned char B = 0;
char Y = 0;
char U = 0;
char V = 0;
double tmp = 0;
for ( int i = 0; i < height; ++i )
{
for ( int j = 0; j < width; ++j )
{
pBGR = pRGB+ i*width*3+j*3;
Y = *(pY+i*width+j);
U = *pU;
V = *pV;
//B
tmp = MB(Y, U, V);
//B = (tmp > 255) ? 255 : (char)tmp;
//B = (B<0) ? 0 : B;
B = (unsigned char)tmp;
//G
tmp = MG(Y, U, V);
//G = (tmp > 255) ? 255 : (char)tmp;
// G = (G<0) ? 0 : G;
G = (unsigned char)tmp;
//R
tmp = MR(Y, U, V);
//R = (tmp > 255) ? 255 : (char)tmp;
//R = (R<0) ? 0 : R;
R = (unsigned char)tmp;
*pBGR = R;
*(pBGR+1) = G;
*(pBGR+2) = B;
if ( i%2 == 0 && j%2 == 0)
{
*pU++;
//*pV++;
}
else
{
if ( j%2 == 0 )
{
*pV++ ;
}
}
}
}
}
最後に、IplImageに書き込まれたコード:
unsigned char* pRGB = NULL;
pRGB = (unsigned char*)malloc(nSize*sizeof(unsigned char*)*2);
YUV420_C_RGB(pBuf,pRGB,nWidth,nHeight);
IplImage *image;
image = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);
cvSetData(image,pRGB,nWidth*3);
プログラムはすべて実行されました
コンパイル環境vs 2008
opencv2.バージョン0
原帖住所:http://blog.csdn.net/dreamd1987/article/details/7259479