入力形式が YUY2 の場合、実際には YUYV であり、以下の例ではそれを想定しています。ただし、形式が実際に UYVY である場合は、例または色空間で順序を変更するだけです (以下の注を参照)。
この YUY2/YUYV422 データは、2 チャネルの Mat 配列を介して OpenCV に提示できます。
Mat img を埋める方法は 2 つあります。コピーによる方法と参照による方法です。用途に応じて、どちらかをお選びいただけます。
どちらも、char 配列に yuv データがあると想定していますimage_yuv
。
1a. 元のデータを参照する (メモリ割り当てなし; 高速):
Mat img(height, width, CV_8UC2, img_yuv);
1b. データを Mat にコピーすることにより:
Mat img(height, width, CV_8UC2);
uchar *pix = img.ptr<uchar>(r); // first byte of the row in image
for (int r = 0, b=0; r < height; r++) {
for (int c = 0; c < width; c+=4) {
*pix++ = image_yuv[b++]; // y
*pix++ = image_yuv[b++]; // u
*pix++ = image_yuv[b++]; // y
*pix++ = image_yuv[b++]; // v
}
}
Mat img にデータがあるので、cvtColor を使用して他の色空間に変換できます。
2a. BGR に変更:
cvtColor(img, img_p, COLOR_YUV2BGR_YUY2);
imshow("window", img_p);
2b. グレースケールに変更:
cvtColor(img, img_p, COLOR_YUV2GRAY_YUY2);
imshow("window", img_p);
注: 形式が UYVY の場合は、コピー順序を変更するか、カラー スペース (COLOR_YUV2BGR_UYVY または COLOR_YUV2GRAY_UYVY) を変更します。OpenCV ソース コードの imgproc.hpp を参照してください。