YUV420 NV12 NV21



Yuv420 Nv12 Nv21



V4L2_PIX_FMT_NV12( 'NV12')、V4L2_PIX_FMT_NV21( 'NV21')




V4L2_PIX_FMT_NV12( 'NV12')、V4L2_PIX_FMT_NV21( 'NV21')
前へ YUVフォーマット

名前

V4L2_PIX_FMT_NV12V4L2_PIX_FMT_NV21 —&frac12水平および垂直クロマ解像度のフォーマット。YUV4:2:0とも呼ばれます。 V4L2_PIX_FMT_YVU420とは対照的に、交互のクロマサンプルを持つ1つの輝度と1つのクロミナンス平面



説明

これらは、YUV 4:2:0フォーマットの2プレーンバージョンです。 3つのコンポーネントは、2つのサブイメージまたはプレーンに分割されます。 Y平面が最初です。 Yプレーンのピクセルあたりのバイト数は1バイトです。 V4L2_PIX_FMT_NV12の場合、結合されたCbCrプレーンはメモリ内のYプレーンの直後に続きます。 CbCr平面は、Y平面(および画像)と同じ幅(バイト単位)ですが、高さはピクセル単位で半分です。各CbCrペアは4つのピクセルに属しています。たとえば、Cb0/ Cr0Y 'に属する00、Y '01、Y '10、Y '十一V4L2_PIX_FMT_NV21 CbバイトとCrバイトが交換されることを除いて同じですが、CrCbプレーンはCrバイトで始まります。

Yプレーンの各行の後にパッドバイトがある場合、CbCrプレーンの行の後には同じ数のパッドバイトがあります。

例2.23。 V4L2_PIX_FMT_NV12 4×4ピクセルの画像



バイトオーダー。 各セルは1バイトです。

開始+0: Y '00 Y '01 Y '02 Y '03
開始+4: Y '10 Y '十一 Y '12 Y '13
開始+8: Y '20 Y '21 Y '22 Y '2. 3
開始+12: Y '30 Y '31 Y '32 Y '33
開始+16: Cb00 Cr00 Cb01 Cr01
開始+20: Cb10 Cr10 Cb十一 Cr十一

カラーサンプルの場所。

0 1 3
0 Y Y Y Y
C C
1 Y Y Y Y
Y Y Y Y
C C
3 Y Y Y Y


YUVフォーマットには2つの主要なタイプがあります:平面とパックです。
平面YUV形式の場合、最初にすべてのピクセルのYが格納され、次にすべてのピクセルのUが格納され、次にすべてのピクセルのVが格納されます。
パックされたYUV形式の場合、各ピクセルのY、U、およびVは連続的にインターリーブ*されて保存されます。

YUVは3つのコンポーネントに分けられます。「Y」は明るさ(輝度またはルマ)を表し、グレー値です。「U」と「V」はクロミナンス(クロミナンスまたはクロマ)を表します。役割は画像の色と彩度。ピクセルの色を指定するために使用されます。

よく知られているRGBと同様に、YUVもカラーコーディング方式であり、主にテレビシステムやアナログビデオ分野で使用されています。明るさ情報(Y)と色情報(UV)を分離し、UV情報なしで完全な画像を表示できます。ただの白黒です。このデザインは、カラーテレビと白黒テレビの互換性の問題を解決します。さらに、YUVはRGBと同時に3つの独立したビデオ信号を送信する必要がないため、YUVモードでの送信は帯域幅をほとんど消費しません。

YUVコードストリームの保存形式は、実際にはそのサンプリング方法と密接に関連しています。 YUV4:4:4、YUV4:2:2、YUV4:2:0の3つの主流のサンプリング方法があります。詳細な原理は、インターネット上の他の記事から理解できます。ここでは、各ピクセルのYUV値のみが正しく復元されるため、サンプリング形式に従ってコードストリームから各ピクセルのYUV値を復元する方法を強調したいと思います。各ピクセルのRGB値は、YUVとRGBの変換式で抽出し、表示することができます。

3枚の写真で取得方法を視覚的に表現します。黒い点はサンプリングされたピクセルのY成分を表し、白丸はピクセルのUV成分を表します。

最初に次の段落を覚えておいてください。後で各ピクセルのYUVコンポーネントを抽出するために使用します。

  1. YUV 4:4:4サンプリング、各YはUVコンポーネントのセットに対応します。
  2. YUV 4:2:2サンプリング、2つのYごとにUVコンポーネントのセットを共有します。に
  3. YUV 4:2:0サンプリング、4つのYごとにUVコンポーネントのセットを共有します。に

2.保管方法

以下に、一般的なYUVコードストリームの保存方法を画像形式で示し、各ピクセルのYUVデータをサンプリングする方法を保存方法に添付します。その中で、Cb、Cr意味はU、Vに相当します。

(1)YUVYフォーマット(YUV422に属する)

YUYVは、YUV422サンプリングのストレージ形式の1つです。 2つの隣接するYは、隣接する2つのCbとCrを共有します。分析によると、ピクセルY'00とY'01の場合、CbとCrの値は両方ともCb00とCr00であり、他のピクセルのYUV値は類推によって推定されます。 (2)UYVYフォーマット(YUV422に属する) UYVYフォーマットもYUV422サンプリングのストレージフォーマットの1つですが、UVの順序が異なるという点でYUYVとは異なります。各ピクセルのYUV値を復元する方法は上記と同じです。 (3)YUV422P(YUV422に属する) YUV422PもYUV422の一種に属しています。プレーンモード、つまりプレーンモードです。 YUVデータをインターリーブしませんが、最初にすべてのYコンポーネントを格納し、次にすべてのU(Cb)コンポーネントを格納し、最後にすべてのV(Cr)コンポーネントを格納します。上の図を示します。各ピクセルのYUV値抽出方法は、YUV422形式に従った最も基本的な抽出方法でもあります。つまり、2つのYが1つのUVを共有します。たとえば、ピクセルY'00とY'01の場合、CbとCrの値は両方ともCb00とCr00です。 (4)YV12、YU12フ​​ォーマット(YUV420に属する)

YU12とYV12はYUV420フォーマットに属しており、これもプレーンモードです。 Y、U、およびVコンポーネントは個別にパッケージ化され、順番に保存されます。各ピクセルのYUVデータ抽出は、YUV420形式の抽出方法に従います。つまり、4つのYコンポーネントがUVのセットを共有します。上の図では、Y'00、Y'01、Y'10、およびY'11がCr00とCb00を共有しており、その他は類似していることに注意してください。

(5)NV12、NV21(YUV420に属する)

NV12とNV21は、2プレーンモードであるYUV420形式に属しています。つまり、YとUVは2つのプレーンに分割されますが、UV(CbCr)は3つのプレーンではなくインターリーブストレージです。抽出方法は前の方法と同様です。つまり、Y'00、Y'01、Y'10、Y'11はCr00、Cb00を共有します。

YUV420平面データ、例として720×488サイズの画像YUV420平面を取り上げます。

そのストレージ形式は次のとおりです。合計サイズは(720×480×3 >> 1)バイトで、

Y、U、Vの3つの部分に分かれています

Yコンポーネント:(720×480)バイト

U(Cb)コンポーネント:(720×480 >> 2)バイト

V(Cr)コンポーネント:(720×480 >> 2)バイト

3つの部分は最初に内部的に一列に格納され、3つの部分はY、U、Vの順序で格納されます。

つまり、0-720×480バイトのYUVデータはY成分の値です。

720×480--720×480×5/4バイトはU成分

720×480×5 / 4-720×480×3/2バイトはVコンポーネントです。

4:2:2および4:2:0変換:

最も簡単な方法:

YUV4:2:2 ---> YUV4:2:0 Yは変更されないままで、UおよびV信号値はライン(垂直方向)で1回サンプリングされます。 YUV4:2:0 ---> YUV4:2:2 Yは変更されず、UおよびV信号値の各行がコピーされて2つの連続したデータ行が形成されます。

YUV420では、ピクセルはYに対応し、4X4の小さな正方形はUとVに対応します。すべてのYUV420画像で、Y画像のみがグレースケール画像であるため、Y値の配置はまったく同じです。 YUV420spとYUV420pのデータフォーマットは原理的に全く異なります。 420pは、最初にUを保存し、次にVを保存します。これは、UVが連続していることを意味します。そして420spはUVとUVとして交互に保存されます。 (下図参照)上記の理論により、メモリに格納されているYUV420のサイズを正確に計算することができます。幅*高さ= Y(合計)U = Y / 4 V = Y / 4

したがって、メモリ内のYUV420データの長さはwidth * hight * 3/2です。

解像度が8X4のYUV画像を想定すると、その形式は次のとおりです。

YUV420spのフォーマットは下図のようになります。 YUV420spのフォーマットは次のとおりです。

YUV420pのデータ形式は次のとおりです

90度回転 アルゴリズム

public static voidrotateYUV240SP(byte [] src、byte [] des、int width、int height)
{{

int wh =幅*高さ
// Yを回転します
int k = 0
for(int i = 0ifor(int j = 0j{{
des [k] = src [width * j + i]
k ++
}
}

for(int i = 0ifor(int j = 0j{{
des [k] = src [wh + width * j + i]
des [k + 1] = src [wh + width * j + i + 1]
k + = 2
}
}


}

YV12とI420の違い一般的に、直接収集されたビデオデータはRGB24形式であり、RGB24の1フレームのサイズはサイズ=幅×高さ×3ビット、RGB32 =幅×高さ×4のサイズです。はI420(つまり、YUV標準フォーマット4:2:0)であり、データ量はサイズ=幅×高さ×1.5ビットです。 RGB24データが収集された後、この形式のデータを初めて圧縮する必要があります。つまり、画像の色空間はRGB2YUVによって決定されます。 X264はエンコード時に標準のYUV(4:2:0)を必要とするためです。ただし、YV12も(4:2:0)ですが、YV12とI420は異なることに注意してください。収納スペースの上にいくつかのエリアがありますしない。 YV12:明るさ(行×列)+ U(行×列/ 4)+ V(行×列/ 4)

I420:明るさ(行×列)+ V(行×列/ 4)+ U(行×列/ 4)

YV12とI420は基本的に同じである、つまりUVの順序が異なることがわかります。

最初のデータ圧縮後、トピックRGB24-> YUV(I420)を続けます。このようにして、データ量が半分に減ります。なぜですか?ははは、これは基本的すぎるので、これ以上は書きません。同様に、RGB24-> YUV(YV12)の場合も、半分になります。ただし、どちらも半分ですが、YV12の場合は効果が大幅に失われます。次に、X264エンコード後、データ量が大幅に削減されます。エンコードされたデータをパックし、RTPを介してリアルタイムで送信します。宛先に到着後、データを取り出してデコードします。デコードが完了した後も、データはYUV形式のままであるため、Windowsドライバーがデータを処理できるように変換する必要があります(YUV2RGB24)。

YUY2は4:2:2です[Y0 U0 Y1 V0]

yuv420pとYUV420の違いはストレージ形式が異なりますyuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420:yuv yuv yuv

YUV420P、Y、U、Vの3つのコンポーネントはすべてフラット形式であり、I420とYV12に分けられます。 I420フォーマットとYV12フォーマットの違いはUプレーンとVプレーンにあります。 I420形式では、U平面はY平面の直後に続き、次にV平面(つまり:YUV)に続きますが、YV12は反対です(つまり:YVU)。
YUV420SP、Yコンポーネント平面フォーマット、UVパッキングフォーマット、つまりNV12。 NV12はNV21に似ており、UとVはずらされており、違いはUVの順序にあります。
I420:YYYYYYYY UU VV => YUV420P
YV12:YYYYYYYY VV UU => YUV420P
NV12:YYYYYYYY UVUV => YUV420SP
NV21:YYYYYYYY VUVU => YUV420SP