2016-03-22 4 views
2

yuv_nv12(4:2:0)タイプの(CMSampleBufferRef)imageBufferがあります。YUV-NV12ビデオバッファのyプレーンとuvプレーンの続き

私は次のコードを実行し、結果が混乱していることを確認します。

UInt8 *baseSRC = (UInt8 *)CVPixelBufferGetBaseAddress(imageBuffer); 
UInt8 *yBaseSRC = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); 
UInt8 *uvBaseSRC = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1); 
int width = (int)CVPixelBufferGetWidthOfPlane(imageBuffer, 0); //width = 480; 
int height = (int)CVPixelBufferGetHeightOfPlane(imageBuffer, 0); //height = 360; 

int y_base = yBaseSRC - baseSRC;  //y_base = 64; 
int uv_y = uvBaseSRC-yBaseSRC;  //uv_y = 176640; 
int delta = uv_y - width*height;  //delta = 3840; 

この結果についてはいくつか質問があります。

1:なぜbaseSRCyBaseSRCと等しくないのですか?

2:なぜyBaseSRC+width*heightuvBaseSRCと等しくないのですか?理論的には、y平面データの後にはuv平面データが続き、中断することはありません。今は、サイズが3840バイトのものでinteruptedされている、私はそれを取得しません。

3:このサンプルピクセルを次のコードで変換しようとすると、ほとんどのiOSデバイスで正しく動作しますが、iPhone 4では表示されません。iPhone 4sでは、変換後にピクセルバッファが緑色になります側面の線。

Mat nv12Mat(height*1.5,width,CV_8UC1,(unsigned char *)yBaseSRC); 
Mat rgbMat; 
cvtColor(nv12Mat, rgbMat, CV_YUV2RGB_NV12); 

今rgbMatは次のようになります

enter image description here

+1

CVPixelBuffersは不透明型であり、私はあなたが見つけデルタはCVPixelBufferデータ型の一部であるデータであることを推測するでしょう。データ型が文書化されておらず、Appleが必要なデータを抽出するためのAPIを提供しているので、私はデータの編成方法を前提にしません。 opencvマットについては、なぜ高さ(高さ* 1.5)を使用していますか?あなたはちょうど '高さ'を渡す必要があります。 – blackirishman

+0

@blackirishman 'height'はy平面の高さなので、uv平面の高さは 'height/2.0'に等しいので、バッファの合計サイズは 'width * height + width * height/2.0'でなければなりません。 'width * height * 1.5'と同じ意味です。 –

+0

これを初めて書いたときに、y面のマットを作成していましたか? CVPixelBufferGetWidthOfPlaneとCVPixelBufferGetHeightOfPlaneを呼び出すと、マットに入力する幅と高さが与えられます。 – blackirishman

答えて

1

最後に、基本的には、溶液は、メモリの新しい部分を割り当て、かつy平面データおよびUV平面data.Andを連結することで、解決策を見つけましたそれはcvmatに変換されるまでうまく動作します。ここで

は、コードスニペットです:

UInt8 *newBase = (UInt8 *)malloc(landscapeWidth*landscapeHeight*1.5); 
memcpy(newBase, yBaseSRC, landscapeWidth*landscapeHeight); 
memcpy(newBase+landscapeWidth*landscapeHeight, uvBaseSRC, landscapeWidth*landscapeHeight*0.5); 
Mat nv12Mat(landscapeHeight*1.5,landscapeWidth,CV_8UC1,(unsigned char *)newBase); 
関連する問題