YUY2とYUYVについて
目的、概要
これらのカラーフォーマットは、フォーマット名は異なりますが、メモリー上のデータの並びは以下の通り同じように並んでいます。
YUY2(メモリー上のデータの並び:Y、U、Y、V)
YUYV(メモリー上のデータの並び:Y、U、Y、V)
Y 輝度信号
U 色差信号(Cb)
V 色差信号(Cr)
UVCカメラではYUY2(もしくはYUYV)に設定できるカメラとできないカメラ、またそれらのカラーフォーマットで画像を取得する各種アプリケーションが存在しています。それらのアプリケーションでカメラを動作させようとすると、カメラから出力されるカラーフォーマットをYUY2(もしくはYUYV)に設定するか、任意に変換しなければなりません。
産業用UVCカメラがYUY2(もしくはYUYV)に対応している場合
DFK33Uシリーズは、YUY2のカラーフォーマットで画像出力可能です。Linuxの場合は「tcam-ctrl -c <serial>」で設定可能なフォーマットを確認してみましょう。YUY2が設定できれば以下のgstreamerのパイプラインでYUY2の画像を取得できます。
gst-launch-1.0 tcambin ! video/x-raw,format=YUY2, width=1440, height=1080,framerate=30/1 ! videoconvert ! ximagesink
その他PythonやC#、C++のプログラムにてカラーフォーマットを直接指定することができます。
産業用UVCカメラがYUY2(もしくはYUYV)に対応していない場合
TheImagingSource社のカメラでは、YUY2のカラーフォーマットに対応していない(=YUY2フォーマットで出力ができない)カメラがあります(37Uシリーズ、USB2カメラ)。上記と同じようにLinuxの場合は「tcam-ctrl -c <serial>」で設定可能なフォーマットを確認してみましょう。アプリケーション側がYUY2(もしくはYUYV)で待ち受けている場合は、カメラから出力される画像をYUY2やYUVYに変換してアプリケーション側に引き渡す必要があります。それぞれ以下2通りの方法があります。
Gstreamerのパイプラインの中でYUY2に変換してしまう方法
GstreamerでBGRxでカラー画像取得し、videoconvert後にYUY2に変換します。
tcambin ! video/x-raw, format=BGRx, width=1440, height=1080,framerate=30/1 !
videoconvert ! video/x-raw, format=YUY2, width=1440, height=1080,framerate=30/1 ・・・
OpenCVのcvCvtColor関数でYUY2に変換する方法
以下Pythonのプログラムです。
ret, frame = cap.read() #上記で取得したフレームをframeに格納。
cv2. cvCvtColor(frame, CV_BGR2YUV) //BGRからYUY2に変換