항상 코딩할때마다 막혀서 질문하러와서 많이 배워가니 너무 나쁘게만 보지 말아주세요 ㅠㅠ
다름아니라 이번 기회에 OpenCv를 배우게 되는데요...
RGB 를 YCrCb 로 변환하는 것입니다.
나머지는 제외하고 핵심적인 부분만 긁어왔습니다.
void CConvertColorModel::RGB_TO_YCbCr(IplImage* img_in ,IplImage* img_Y ,IplImage* img_Cb ,IplImage* img_Cr)
{
/*
img_in = cvCreateImage(cvSize(img_in->width,img_in->height),8,3);
img_Y = cvCreateImage(cvSize(img_in->width,img_in->height),8,1);
img_Cb = cvCreateImage(cvSize(img_in->width/2,img_in->height/2),8,1);
img_Cr = cvCreateImage(cvSize(img_in->width/2,img_in->height/2),8,1);
*/ 이런형태로 이미지를 받아옵니다.
for(int i=0 ; i<img_in->height ; i=i+1)
{
for(int j=0 ; j<img_in->widthStep ;j=j+3)
{
unsigned char R,G,B,Y,Cb,Cr;
//RGB 입력
B = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j ]);
G = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j+1 ]);
R = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j+2 ]);
//여기까지 칼라사진의 RGB값을 받아왔습니다.
Y= 0.299*R+0.587*G+0.114*B+0;
Cb= (-0.169)*R+(-0.331)*G+(0.5)*B+128;
Cr= (0.5)*R+(-0.419)*G+(-0.081)*B+128;
//RGB를 Y , Cb, Cr로 변환하였습니다.
/*
Cb = limit((unsigned char)img_in->imageData[ R*(-0.169)+G*(-0.331)+B*0.5+128 ]) ;
Cr = limit((unsigned char)img_in->imageData[ R*(0.5)+G*(-0.419)+B*(-0.081)+128 ]) ; ;
*/
/*Y Cb Cr Subsampling 4:2:0 (이미지 사이즈를 고려하여 subsampling이 가능하도록 변경)
*/
img_Y->imageData[i*img_Y->widthStep+(j+3)/3+2]=Y;
//문제이는 이곳인데, 일단 Y영상까지는 무난하게 출력되었습니다. 4:2:0으로 샘플링하라하여 widthstep인 j를 2칸에 한번꼴로 샘플링하도록 하였습니다.. 사실 이게 맞는지도 의문이 가더군요.. 어찌어찌 Y영상은 잘 출력되긴하는데..
다음은 img_Cr 을 띄워야하는데 위에 보시면 아시겠지만 사이즈가 원래 이미지의 1/4로 줄었습니다. ㅠㅠ 여기서 떡 막히더군요.. opecv 책도 찾아가며 해봤는데 도저히 감이 안잡혀서 여기에 여쭙습니다... ㅠㅠ
}
}
}