YUV format
Y : 휘도 성분 / Cb, Cr : 색차 성분
HVS (Human Visual System)에 의하면 인간은 색상보다 명암에 민감함으로 색차 성분을 줄여도 그 변화를 느끼지 못한다. 따라서 색차 성분을 줄인 정도에 따라 4:4:4, 4:2:2, 4:2:0 format으로 분류 된다.
Source Code
아래 예제 코드는 YUV 4:2:0 Format을 RGB로 변환 하여 출력하는 openCV 코드이다.
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
const int frame_width = 1024;
const int frame_height = 768;
const int pixels_num_in_frame = frame_width*frame_height;
int main( int argc, char** argv )
{
Mat mat_y, mat_u, mat_v, mat_ext_u, mat_ext_v, mat_yuv;
ifstream src_file("ChinaSpeed_1024x768_30.yuv", std::ifstream::binary);
// memory allocation
mat_y.create(frame_height, frame_width, CV_8UC1);
mat_u.create(frame_height>>1, frame_width>>1, CV_8UC1);
mat_v.create(frame_height>>1, frame_width>>1, CV_8UC1);
mat_yuv.create(frame_height, frame_width, CV_8UC3);
vector<char> vc_y(pixels_num_in_frame);
vector<char> vc_u(pixels_num_in_frame>>2);
vector<char> vc_v(pixels_num_in_frame>>2);
// copy YUV data from file
src_file.read( &vc_y[0], pixels_num_in_frame);
src_file.read( &vc_u[0], pixels_num_in_frame>>2);
src_file.read( &vc_v[0], pixels_num_in_frame>>2);
// copy YUV vector data to Matix
for(int y=0; y<frame_height; y++)
{
for(int x=0; x<frame_width; x++)
{
mat_y.at<uchar>(y, x) = vc_y[y*frame_width+x];
}
}
for(int y=0; y<frame_height>>1; y++)
{
for(int x=0; x<frame_width>>1; x++)
{
mat_u.at<uchar>(y, x) = vc_u[y*(frame_width>>1)+x];
mat_v.at<uchar>(y, x) = vc_v[y*(frame_width>>1)+x];
}
}
// up-scale of chroma components
resize(mat_u, mat_ext_u, mat_y.size(), 0, 0, 0);
resize(mat_v, mat_ext_v, mat_y.size(), 0, 0, 0);
// merge 3 components
for(int y=0; y<frame_height; y++)
{
for(int x=0; x<frame_width; x++)
{
mat_yuv.at<Vec3b>(y, x)[0] = mat_y.at<uchar>(y, x);
mat_yuv.at<Vec3b>(y, x)[1] = mat_ext_u.at<uchar>(y, x);
mat_yuv.at<Vec3b>(y, x)[2] = mat_ext_v.at<uchar>(y, x);
}
}
// convert color format for display
cvtColor(mat_yuv, mat_yuv, CV_YCrCb2RGB);
// display
namedWindow( "Current Sequence", 2 );
imshow("Current Sequence" , mat_yuv );
waitKey();
}
※ 실습 환경
openCV2.3
visual studio 10.0