Introduction

OpenCVSharp を使って、Webカメラから取得した YUV 形式のフレームを BGR 形式に変換する際の疑問について。

OpenCV で利用される cv::cvtColor を使って YUV 形式を BGR 形式の変換する際、指定できるフラグは下記になる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//YUV 4:2:0 formats family
CV_YUV2BGR_NV12 = 91,
CV_YUV2BGR_NV21 = 93,

CV_YUV2BGR_YV12 = 99,
CV_YUV2BGR_IYUV = 101,
CV_YUV2BGR_I420 = CV_YUV2BGR_IYUV,

//YUV 4:2:2 formats family
CV_YUV2BGR_UYVY = 108,
CV_YUV2BGR_Y422 = CV_YUV2BGR_UYVY,
CV_YUV2BGR_UYNV = CV_YUV2BGR_UYVY,

CV_YUV2BGR_YUY2 = 116,
CV_YUV2BGR_YVYU = 118,
CV_YUV2BGR_YUYV = CV_YUV2BGR_YUY2,
CV_YUV2BGR_YUNV = CV_YUV2BGR_YUY2,

が、末尾の _NV12 とか _YVYU は何?って話。

What’s that?

簡単に言えば、YUV 形式における細部の詳細。
変換元の YUV 形式のフレームが実際に何であるかを明示する必要がある。

詳細は

が詳しい。

以降は OpenCV で定義されている名称に絞った一覧。

格納方式

名前 概要
Packed format (Interleaved) Y、U、V を単一配列に格納。よくある RGB や BGR 形式と同じ並び
Planer format Y、U、V をそれぞれ異なる配列に格納
Semi-planar format Y のみ異なる配列に格納し、U、V を単一配列に格納

フォーマット名

OpenCVSharp なら VideoCapture.FourCC プロパティを見れば、現在のフォーマットがわかる。

名前 格納方式 YUV 比率 別名
NV12 Semi-planar format 4:2:0
NV21 Semi-planar format 4:2:0
YV12 Planer format 4:2:0
IYUV Planer format 4:2:0 IYUV
I420 Planer format 4:2:0 I420
UYVY Packed format 4:2:2 Y422、UYNV
Y422 Packed format 4:2:2 UYVY、UYNV
UYNV Packed format 4:2:2 UYVY、Y422
YVYU Packed format 4:2:2
YUY2 Packed format 4:2:2 V422、YUYV、YUNV
YUYV Packed format 4:2:2 YUY2、V422、YUNV
YUNV Packed format 4:2:2 YUY2、V422、YUYV

Wrap up

  • YUV 比率が同じだからと言って適当に指定するとおかしな結果になる