0

YUV 形式でカメラからキャプチャした画像を RGB 形式に変換する際に問題があります。

それを行うために使用される関数は次のとおりです。

int uwidth = 1920;
int uheight= 1080;

int i = 0,j = 0, r = 0, g = 0, b = 0;
typedef unsigned char BYTE;
IplImage* m_RGB = cvCreateImage(cvSize(uwidth, uheight), IPL_DEPTH_8U, 3);
unsigned char* pData = (unsigned char *) frameBytes;

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4)
{
   unsigned char u = pData[j];
   unsigned char y = pData[j+1];
   unsigned char v = pData[j+2];

   b = 1.0*y + 8 + 1.402*(v-128);
   g = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);
   r = 1.0*y + 1.772*(u-128);

   if(r>255) r =255;
   if(g>255) g =255;
   if(b>255) b =255;
   if(r<0)   r =0;
   if(g<0)   g =0;
   if(b<0)   b =0;

   m_RGB->imageData[i] = (BYTE)(r*220/256);
   m_RGB->imageData[i+1] = (BYTE)(g*220/256);
   m_RGB->imageData[i+2] =(BYTE)(b*220/256);

}

cvNamedWindow("ck", CV_WINDOW_AUTOSIZE);
cvShowImage( "ck", m_RGB );
cvReleaseImage(&m_RGB);

問題は、画面のウィンドウに 1 つではなく 2 つの画像が表示され、色は良いが比率が良くないことです。

誰かがそれらの問題について考えを持っていますか?

編集: 画像出力

4

2 に答える 2

1

imageDataが次のように定義されていると仮定しましょう

BYTE* imageData;

この場合、このループは多くのことを教えてくれます:

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4)

i+=6ピクセルを設定するたびに、次のピクセルをスキップすることを意味します (または、一度に 2 つのピクセルを設定することを期待していました)。

j+=4
unsigned char u = pData[j];
unsigned char y = pData[j+1];
unsigned char v = pData[j+2];

カメラのフォーマットがUYVYであることを意味します:

  • 2 つの連続するピクセル P0 と P1 を記述します。
  • クロマチャンネルは P0 と P1 で同じです。U = U0 = U1V = V0 = V1
  • ルミナチャネルが異なります。1 つ目は P0 用で、2 つ目は P1 用です。

反復で 2 ピクセルを設定する必要があります。

m_RGB->imageData[i] = r1;
m_RGB->imageData[i+1] = g1;
m_RGB->imageData[i+2] =b1;
m_RGB->imageData[i+3] = r2;
m_RGB->imageData[i+4] = g2;
m_RGB->imageData[i+5] =b2;

r1r2(およびその他) の違いは、変換式で 2 つの異なるものを使用することですY

于 2012-08-29T10:13:32.220 に答える
1

Mac 用にプログラミングしている場合は、OSX 10.9 および 10.10 の vImage 変換ライブラリに最近追加された機能を確認してください。そこにあるものは本当に驚くべきものです。私は独自の 24 ビットから 32 ビットへの変換を行っていて、約 6 ミリ秒/フレーム (1920x1080) に磨き上げました。15 倍以上の vImage によって水からすぐに吹き飛ばされます。

于 2014-08-01T05:24:56.547 に答える