소 스 코드가 다소 길어 졌지만 크게 보면 카메라를 입력 받는 소스에서 이진화 함수인 cvThreshold() 함수가 추가된 것 밖에는 없습니다. 이 함수를 사용할 때 주의해야 할 것은 항상 흑백 이미지로 변환해서 넣어 주어야 한다는 것.
cvThreshold(gray, output, threshold, 255, CV_THRESH_BINARY);
위
함수는 입력된 gray 이미지에서 threshold 값을 초과한 값은 255 로 변환하고 이하는 0 으로 변환하여output
이미지를 만들어 냅니다. 이와는 반대로 적용되게 한다거나 일정 값 이하는 0 으로 변환하고 초과되는 값만 보여주는등의 옵션이
있습니다. 옵션을 변화 시켜가며 변화되는 모습을 익혀 보도록 합시다.
CV_THRESH_BINARY : threshold 값 초과는 255, 이하는 0
CV_THRESH_BINARY_INV : threshold 값 초과는 0, 이하는 255
CV_THRESH_TRUNC : threshold 값 초과는 threshold, 이하는 그대로
CV_THRESH_TOZERO : threshold 값 초과는 그대로, 이하는 0
CV_THRESH_TOZERO_INV : threshold 값 초과는 0, 이하는 그대로
이
번 프로그램에는 Trackbar 가 추가되었는데 이는 나중에도 유용하게 쓰이므로 잘 익혀 두시기 바랍니다. 아래
함수는"T9-camera" 이름의 윈도우에 0 부터 255 범위를 같는 "T" 이름의 Trackbar 를 붙입니다.
Trackbar의 초기 위치는 threshold 값이 결정하며 bar 를 조절하여도 그 값은 threshold 변수에 들어가게
됩니다. 그리고현재는 NULL 로 되어 있지만 이부분에 함수명을 적으면 bar 가 변경될 때마다 해당하는 함수를
호출하게 됩니다. 이 함수는반드시 int 형 변수 하나를 가지고 있어야 하고 이 변수에 Trackbar 의 값이 넘어 오므로
함수에서 값을 가지고영상처리를 해주면 됩니다.
cvCreateTrackbar("T", "T9-camera", &threshold, 255, NULL);
cvCvtColor()
함수는 Color 변환을 해주는 함수입니다. 아래 함수는 RGB 채널을 가지고 있는 image 를Gray 채널로 바꾸어서
gray 에 넣어주는 역할을 합니다. 마지막 인자는 Color 변환 모드인데 여기에도 다양한 옵션이존재하므로 필요한 모델을
사용하시면 됩니다.
cvCvtColor(image, gray, CV_RGB2GRAY);
CV_RGB2GRAY : 흑백으로 변환
CV_RGB2YCrCb : 주로 Skin Color 모델을 할때 변환( 손 제스쳐 인식, 얼굴 인식 )
CV_RGB2HLS
CV_RGB2HSV
CV_RGB2Lab
CV_RGB2Luv
- 소스 코드(압축 파일 첨부)
#include <cv.h>
#include <highgui.h>
void main()
{
int i, threshold = 128; // 임계값(Threshold) 설정
IplImage* image = 0;
IplImage* output = 0;
IplImage* gray = 0;
CvCapture* capture = cvCaptureFromCAM(0); // 카메라 연결
cvNamedWindow( "T9-camera", 0 ); // 원본 영상을 띄울 윈도우
cvNamedWindow( "T9-output", 0 ); // 결과 영상을 띄울 윈도우
cvCreateTrackbar("T", "T9-camera", &threshold, 255, NULL); // "T9-camera" 윈도우에 bar 를 붙이고 threshold 값을 변화 시킴
// 이름은 "T" 를 붙이고 0 부터 255 사이의 범위값을 가짐
while(1) {
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );
cvShowImage( "T9-camera", image );
if(!output){
gray = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1); // 흑백 이미지 생성
output = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1); // 흑백 이미지 생성
}
cvCvtColor(image, gray, CV_RGB2GRAY); // 컬러를 흑백으로 변환
if( cvWaitKey(10) >= 0 )
break;
// 영상의 각 픽셀(x,y) 값이 threshold 값의 초과는 255 로, 그 이하는 0 으로 변환
cvThreshold(gray, output, threshold, 255, CV_THRESH_BINARY);
output->origin = image->origin; // 방향이 뒤집어 진것을 바로 잡아줌
cvShowImage( "T9-output", output );
}
cvReleaseImage( &gray );
cvReleaseImage( &output );
cvReleaseCapture( &capture );
cvDestroyWindow( "T9-output" );
cvDestroyWindow( "T9-camera" );
}
'1.소프트웨어 이야기 > 02.Vision(Image Processing)' 카테고리의 다른 글
[펌]히스토그램의 이해 (0) | 2007.12.06 |
---|---|
OpenCV 초보 강좌 2편[펌]-카메라 입력받기 (0) | 2007.12.06 |
OPENCV 초보 강좌 1편[일부발췌] (0) | 2007.12.06 |