2011-10-31 286 views
8

私は、フィードがYUV形式で入っているテレビキャプチャカードを持っています。私はこの質問に類似した他の投稿を見て、可能なあらゆる方法を試してみましたが、いずれも明確なイメージを提供していませんでした。現時点で最良の結果はOpenCV cvCvtColor(scr, dst, CV_YUV2BGR)関数呼び出しでした。OpenCVでYUVをBGRまたはRGBに変換する

私は現在YUV形式を認識していません。ちょうど4チャンネルを保存するように見えますが、ちょっと混乱してしまいますが、わずか3です​​。キャプチャカードからの画像を含めて、空白を埋めるために使用できる可能性があることを誰かが理解できるようにしておきます。

YUV to BGR converted image

フィードは、DeckLinkの強度Proのカードを介して来ているし、Windows 7環境でのOpenCVを使用してC++アプリケーションにアクセスされています。

更新

私は、この情報に関するWikipediaの記事を見て、自分のアプリケーションで数式を使用しようとしました。以下はコードブロックからの出力を受け取ったコードブロックです。アドバイスをいただければ幸いです。

BYTE* pData; 

    videoFrame->GetBytes((void**)&pData); 

    m_nFrames++; 

    printf("Num Frames executed: %d\n", m_nFrames); 

    for(int i = 0; i < 1280 * 720 * 3; i=i+3) 
    { 
     m_RGB->imageData[i] = pData[i] + pData[i+2]*((1 - 0.299)/0.615); 
     m_RGB->imageData[i+1] = pData[i] - pData[i+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[i+2]*((0.299*(1 - 0.299))/(0.615*0.587)); 
     m_RGB->imageData[i+2] = pData[i] + pData[i+1]*((1 - 0.114)/0.436); 
    } 

Attempted RGB conversion

+0

「私はYUVフォーマットの現在気づかないよ」 - >ウィキペディア。それについて読む:http://en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB – NickLH

+0

この記事をリンクしてくれてありがとうございますが、私はay、u、v、およびy1で作業すると仮定しています。これらの変数を使用してRGB相当量を生成しますか?また、4つの異なる配列を作成して、それぞれの値を取り込んで、それらをすべて一緒にマージする必要がありますか? – Seb

+0

RGBでは3つの色成分があるので、3つの配列しか必要としません。しかし、ええ、基本的に色成分を個別に計算し、どこかに保存する必要があります。 – NickLH

答えて

5

YUV422ストリームをYUV444としてデコードしているように見えます。私はあなたの定数が正しいんだかわからない

for(int i = 0, j=0; i < 1280 * 720 * 3; i+=6, j+=4) 
{ 
    m_RGB->imageData[i] = pData[j] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+1] = pData[j] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+2] = pData[j] + pData[j+1]*((1 - 0.114)/0.436); 
    m_RGB->imageData[i+3] = pData[j+2] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+4] = pData[j+2] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+5] = pData[j+2] + pData[j+1]*((1 - 0.114)/0.436); 
} 

が、最悪の場合、あなたの色はオフになります - 画像を認識する必要があります:あなたが提供するコードにこの修正を試してみてください。

+0

あなたは定数が間違っているのは正しいと思います。すてきで鮮明な画像が見えます。この問題を解決するためにYUV422定数を調べるだけでいいです。このアドバイスをありがとう。 – Seb

1

は、それは間違った道かもしれないが、多くの人が(私は、エンジニアを意味する)のYCbCrでYUVを混ぜます。

cvCvtColor(src, dsc, CV_YCbCr2RGB) 

またはCV_YCrCb2RGBまたは多分より多くのエキゾチックなタイプにしてみます。

+0

私はそれがCV_YCbCrだと申します。 OpenCVにはYUVの列挙子がありません。 – Seb

+2

これは、YUVソースがSDの場合にのみ正しく動作します。基本的な目視検査で正しく見えるかもしれませんが、実際には色は正しくありません。これは、最新のYUV変換用OpenCVソース(2.4.10)がPAL/NTSC/SECAMの601色空間のみをサポートし、HDの709やUHDの2020をサポートしていないためです。 –

+0

Opencv 2.4。*にはYUV列挙子があり、CV_YCbCr2RGBはありません。 代わりにCV_YCrCb2RGBがあります。 – Temak

2

BlackMagic Intensityソフトウェアは、bmdFormat8BitYUVでYUVYのフォーマットを返します。したがって、2つのソースピクセルが4バイトに圧縮されます。私はopenCVのcvtColorがこれを処理できるとは思いません。あなたはどちらかそれを行う自分自身、あるいは単には

編集強度ソフトウェアConvertFrame()関数を呼び出すことができ

:YUVが正常に
enter image description here

として格納されているY(明るさ)を画素ごとにありますが、その行の各交互画素に対してUとV(カラー)のみが表示されます。

したがって、データが上記のようにメモリの先頭を指し示す符号なしのcharである場合。データ[+1] V =データ[+3]
ピクセル2、Y =データ[+2] U =データ[+1] V =データ[ +3]

次に、サンプルコードで使用したYUV-> RGB係数を使用します。

+0

その関数を調べましたが、IDeckLinkInputFrameクラスでは機能しません。最善の方法はこれを自分自身で行うように見えるでしょう。 YUVYが何であるか言及していただきありがとうございます。しかし、あなたが遭遇したことに基づいてコンバージョンの数式を知っていますか?もしあなたが分からないのであれば、あなたの道を離れて私を助けてください。ありがとう – Seb

+0

psはU/V Cr/Cbを間違った方法で持っているかもしれませんが、それは明らかです! –

6

OPENCVの新しいバージョンでは機能に建てられたこのCV_YUYV2BGR_xxxx

+0

私はopencv 2.4を使用しています。5 – kyencn

+0

これは、YUVソースがSDの場合にのみ正しく動作します。基本的な目視検査で正しく見えるかもしれませんが、実際には色は正しくありません。これは、最新のYUV変換用OpenCVソース(2.4.10)がPAL/NTSC/SECAMの601色空間のみをサポートし、HDの709やUHDの2020をサポートしていないためです。 –

1

たぶん誰かのように、アンダースコアの後YUV形式を指定YUVRGBへの変換

cvtColor(src,dst,CV_YUV2BGR_YUY2);

を行うために使用することができていますカラーモデルYCbCrとYUVが混乱しています。 OpenCvは、YCbCrを処理しません。代わりに、それはYCrCbを持ち、はopencvのYUVと同じ方法で実装されています。 OpenCVのソースhttps://github.com/Itseez/opencv/blob/2.4/modules/imgproc/src/color.cpp#L3830から

case CV_BGR2YCrCb: case CV_RGB2YCrCb: 
case CV_BGR2YUV: case CV_RGB2YUV: 
    // ... 
    // 1 if it is BGR, 0 if it is RGB 
    bidx = code == CV_BGR2YCrCb || code == CV_BGR2YUV ? 0 : 2; 
    //... converting to YUV with the only difference that brings 
    // order of Blue and Red channels (variable bidx) 

でも言うべきもう一つのことがあります。
OpenCVのブランチ2.4での変換でbugCV_BGR2YUVCV_RGB2YUVは現在あり。*。

は現在のところ、この式は、実装に使用される:

Y = 0.299B + 0.587G + 0.114R 
U = 0.492(R-Y) 
V = 0.877(B-Y) 

それは(wikipediaに従って)すべきか:

Y = 0.299R + 0.587G + 0.114B 
U = 0.492(B-Y) 
V = 0.877(R-Y) 

チャネル赤と青が実装式に置き忘れています。バグが修正されていない間BGR-> YUV変換する

可能な回避策:

cv::Mat source = cv::imread(filename, CV_LOAD_IMAGE_COLOR); 
    cv::Mat yuvSource;  
    cvtColor(source, yuvSource, cv::COLOR_BGR2RGB); // rearranges B and R in the appropriate order 
    cvtColor(yuvSource, yuvSource, cv::COLOR_BGR2YUV); 
    // yuvSource will contain here correct image in YUV color space 
関連する問題