코드 10-6 히스토그램 역투영을 이용한 피부색 영역 검출 예제 [ch10/backproj]
01 #include "opencv2/opencv.hpp" 02 #include <iostream> 03 04 using namespace cv; 05 using namespace std; 06 07 int main() 08 { 09 // Calculate CrCb histogram from a reference image 10 11 Mat ref, ref_ycrcb, mask; 12 ref = imread("ref.png", IMREAD_COLOR); 13 mask = imread("mask.bmp", IMREAD_GRAYSCALE); 14 cvtColor(ref, ref_ycrcb, COLOR_BGR2YCrCb); 15 16 Mat hist; 17 int channels[] = { 1, 2 }; 18 int cr_bins = 128; int cb_bins = 128; 19 int histSize[] = { cr_bins, cb_bins }; 20 float cr_range[] = { 0, 256 }; 21 float cb_range[] = { 0, 256 }; 22 const float* ranges[] = { cr_range, cb_range }; 23 24 calcHist(&ref_ycrcb, 1, channels, mask, hist, 2, histSize, ranges); 25 26 // Apply histogram backprojection to an input image 27 28 Mat src, src_ycrcb; 29 src = imread("kids.png", IMREAD_COLOR); 30 cvtColor(src, src_ycrcb, COLOR_BGR2YCrCb); 31 32 Mat backproj; 33 calcBackProject(&src_ycrcb, 1, channels, hist, backproj, ranges, 1, true); 34 35 imshow("src", src); 36 imshow("backproj", backproj); 37 waitKey(0); 38 39 return 0; 40 }
• 12행 피부색 히스토그램 정보를 추출할 기준 영상 ref.png 파일을 불러옵니다.
• 13행 기준 영상에서 피부색이 있는 위치를 흰색으로 표시한 마스크 영상 mask.bmp 파일을 불러옵니다.
• 14행 기준 영상을 YCrCb 색 공간으로 변환합니다.
• 16~24행 기준 영상에서 피부색 영역의 CrCb 2차원 히스토그램을 계산하여 hist에 저장합니다.
• 28~30행 입력 영상 kids.png 파일을 불러와 YCrCb 색 공간으로 변환합니다.
• 32~33행 앞서 구한 히스토그램 hist를 이용하여 입력 영상에서 히스토그램 역투영을 수행합니다. 역투영 결과는 backproj에 저장됩니다.