더북(TheBook)

코드 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에 저장됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.