티스토리 뷰

YCbCr를 이용한 손을 검출하는 방법을 포스팅하겠다. 이 방법을 알기위해서는 우선 YCbCr이 무엇인지 부터 알아야 한다. YCbCr(YCC)는 절대 색공간이 아닌 RGB정보를 인코딩하는 방식이다. Y는 휘도성분 즉, 밝기에 대한 값이며, Cb와 Cr은 색차 성분이다. 


RGB에서 YCbCr 색공간의 변경공식은 다음과 같다.

   Y = 0.29900R + 0.58700G + 0.11400B

   Cb = -0.16874R - 0.33126G + 0.50000B

   Cr = 0.50000R - 0.41869G - 0.08131B


영상을 처리하는데 있어, RGB는 세 개의 요소가 시각적으로 균일한 정보를 가지고 있는 반면에, YCbCr은 휘도성분(Y)과 색차 성분(Cb, Cr)을 가지기 때문에 피부, 눈, 입 같은 요소 검출에 많이 사용된다.


YCbCr에 대한 간략한 정보에 대해 알았으니, 이제 손 검출 하는 방법에 대해 알아보자.

검출하는 방법은 YCbCr의 색차를 통해서 검출해보겠다.



IplImage* skin_detect(IplImage* frame, CvScalar min, CvScalar max){
	
	//Declaration Image ( 1 channel and 3 channel)
	IplImage* skin = cvCreateImage(cvGetSize(frame), 8, 3);
	IplImage* single_skin = cvCreateImage(cvGetSize(frame), 8, 1);

	// Get YCbCr model Data and Converted image
	cvCvtColor(frame, skin, CV_BGR2YCrCb);
	cvInRangeS(skin, min, max, single_skin);
	 
	return single_skin;
}

이 함수는 인자 값으로 원본 이미지와 색 정보를 전달하며, 색 정보 min과 max사이의 색 영역의 이미지를 만들어 리턴해준다.


min정보와 max정보의 값이 따라 어느 영역의 이미지라도 데이터를 받아올 수 있게 되는데, 손의 색을 검출해야 하므로, min =  cvScalar(0, 133, 77), max = cvScalar(255, 173, 127) 정도의 값을 주면 손을 검출하는데 무리가 없어보인다. 일반적으로 피부를 검출하는 임계치는 128 ≤ Cr ≤ 170, 73 ≤ Cb ≤ 158 이라고 한다.

	single_skin = skin_detect(image,
		cvScalar(0, 133, 77), cvScalar(255, 173, 127));

결과화면




Hand_det.cpp


YCbCr 입 검출 : http://sks3297.tistory.com/81

YCbCr을 이용한 손 검출, 관련 블로그 : http://miatistory.tistory.com/3



'Language > Computer Vision' 카테고리의 다른 글

[영상처리] 이미지, xml 저장하기  (0) 2014.02.10
[영상처리] YCbCr 입 검출  (1) 2014.01.09
[영상처리] ROI이용해서 관심영역 수정  (5) 2013.12.17
[영상처리] 얼굴 검출  (2) 2013.12.16
[OpenCV] 설치  (0) 2013.10.24
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday