이전 글에서 카메라로부터 받은 각 픽셀의 데이터를 하나하나씩 IplImage 변수에 집어 넣는 것까지 했었다.
이제는 색상 기반의 영상 처리를 위해 기본적으로 해야 할 것들... RGB면 R, G, B, HSI(HSV)면 H, S, I 값으로 분리해서 Threshold시키는 작업을 해야한다. 그러기 위해서는 각 색상 데이터를 분리할 필요가 있는데, 이때 사용하는 것이 cvCvtPixToPlane 함수이다. 함수는
cvCvtPixToPlane(src, dst0, dst1, dst2, dst3)과 같은 형식인데, 함수 내부의 파라미터는 IplImage 변수이다. 함수를 사용하는 모드는 두 가지인데, 하나는 3개의 채널로 이루어진 데이터를 하나씩 분리하는 방법이고, 다른 하나는 4개의 채널로 이루어진 데이터를 하나씩 분리하는 방법이다. 3개의 채널로 분리하는 방법은 src 데이터가 초기화 될 때, 3개의 채널 값을 가지는 데이터로 생성되었을 때, 즉, R, G, B 값과 같은 값만 갖을 때 사용하는 방법이며, 4개의 채널로 분리하는 방법은 하나의 픽셀이 32비트로 이루어지도록 설정했을 때, 즉, cvCreateImage(cvGetSinze(image), 8, 4)처럼 선언을 했을 때 사용한다.
만약, 4개의 채널로 이루어진 변수를 3개 채널만 분리하는 방법을 사용해 버린다면, 에러가 발생할 것이다. 만약 image라는 변수가 4개의 채널로 이루어진 변수라면,
IplImage *image = cvCreate(cvSize(320, 240), 8, 4);
IplImage *R = cvCreate(cvSize(320, 240), 8, 1);
IplImage *G = cvCreate(cvSize(320, 240), 8, 1);
IplImage *B = cvCreate(cvSize(320, 240), 8, 1);
IplImage *A = cvCreate(cvSize(320, 240), 8, 1);
cvCvtPixToPlane(image, R, G, B, NULL) // Error
cvCvtPixToPlane(image, R, G, B, A) // Good
참고로... cvCvtPixToPlane과 반대로 각 채널을 함치는 함수는 cvCvtPlaneToPix이다.
색상 채널을 분리하는 데까지 성공했다면, 이제는 각 채널 값을 기준으로 이잔화를 하는 과정을 수행해야 한다. 여기서 사용하게 되는 함수는 cvThreshold이다. 함수 파라미터 중 마지막 파라미터에 CV_THRESH_BINARY 값을 사용하면, 기준 값을 넘어서는 픽셀은 설정 값으로 아닌 픽셀은 0으로 설정된다.