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:なぜbaseSRC
はyBaseSRC
と等しくないのですか?
2:なぜyBaseSRC+width*height
はuvBaseSRC
と等しくないのですか?理論的には、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は次のようになります
CVPixelBuffersは不透明型であり、私はあなたが見つけデルタはCVPixelBufferデータ型の一部であるデータであることを推測するでしょう。データ型が文書化されておらず、Appleが必要なデータを抽出するためのAPIを提供しているので、私はデータの編成方法を前提にしません。 opencvマットについては、なぜ高さ(高さ* 1.5)を使用していますか?あなたはちょうど '高さ'を渡す必要があります。 – blackirishman
@blackirishman 'height'はy平面の高さなので、uv平面の高さは 'height/2.0'に等しいので、バッファの合計サイズは 'width * height + width * height/2.0'でなければなりません。 'width * height * 1.5'と同じ意味です。 –
これを初めて書いたときに、y面のマットを作成していましたか? CVPixelBufferGetWidthOfPlaneとCVPixelBufferGetHeightOfPlaneを呼び出すと、マットに入力する幅と高さが与えられます。 – blackirishman