티스토리 뷰

YCbCr을 이용하면, 입을 검출할 수 있다는 논문을 보았다. 헌데.. 잘 검출이 되지 않는다.

왜지...


생각은 이렇다. 

얼굴영역의 입은 다른 구역보다 색이 붉다. 그렇다면 이런 특성을 이용하면, 입을 검출할 수 있다.


(아래 사진은 탤런트 김수현이다.)




원본 이미지에서 Cr성분 1채널로 변경 후, 이를 이진화 처리한다. 이진화 처리된 값은 입술 뿐만 아니라 다른 영역도 조금 잡게 된다. 이는 모폴로지 연산을 통해 처리하면 된다. 우선 침식을 통해 잡음을 제거하고, 팽창을 통해 그 위치를 확실하게 해준다.



#include "cv.h"
#include "highgui.h"

IplImage* getCr(IplImage *image);

int main()
{   
	// Load original image, Image path is in my project folder
	IplImage* image = cvLoadImage("images/face1.jpg", 1);
	IplImage* single_skin;// 1 channel  
	
	// Definition Window Frame
	cvNamedWindow("Original_IMAGE", CV_WINDOW_AUTOSIZE);  
	cvNamedWindow("RESULT_IMAGE", CV_WINDOW_AUTOSIZE);    

	// Call function()
	single_skin = getCr(image); 
	cvErode(single_skin, single_skin, NULL, 2);  //침식
	cvDilate(single_skin, single_skin, NULL, 2); //팽창
	
	// Show processing result
	cvShowImage("Original_IMAGE", image);
	cvShowImage("RESULT_IMAGE", single_skin);   
	cvWaitKey(0);

	// Release data  
	cvReleaseImage(&single_skin);
	cvReleaseImage(&image);   
	cvDestroyAllWindows();  

	return 0;
}


IplImage* getCr(IplImage *image){

	IplImage* ycbcr = cvCreateImage(cvGetSize(image), 8, 3);
	IplImage* Cr = cvCreateImage(cvGetSize(image), 8, 1); 

	cvCvtColor(image, ycbcr, CV_BGR2YCrCb ); //RGB모델을 YCbCr모델로 변환
	cvSplit(ycbcr,NULL,Cr,NULL,NULL); //YCbCr 채널분리
	cvThreshold( Cr, Cr, 155, 255, CV_THRESH_BINARY); //RED채널만 이진화 

	return Cr;
} 


이를 활용해서 입을 검출하는데는 한계가 있다. 우선, 이진화 처리하기 위한 임계값 설정이 애매모호한 부분이다. 그리고, 담배를 많이 펴서 입술이 까맣다면..... 추워서 귀가 빨갛다면.... YCbCr로 검출이 힘들 수 있다.



YCbCr 손 검출 : http://sks3297.tistory.com/80


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

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