코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std
using namespace cv;
void detectHScolor(const cv::Mat&  image, double minHue,
    double maxHue, double minSat, double  maxSat, Mat&  mask);
 
int main() {
    Mat image = imread("girl.jpg");
    Mat mask;
    detectHScolor(image, 1601025166, mask);
    Mat detected(image.size(), CV_8UC3, Scalar(000));//하얗게 주려면 255,255,255
    image.copyTo(detected, mask);
    imshow("Girl", image);
    imshow("Detected", detected);
    waitKey(0);
}
 
 
 
void detectHScolor(const Mat&  image, double minHue, double maxHue, double minSat, double  maxSat, Mat&  mask) {
    //detect by hue(minHue~maxHue), saturate(minSat~maxSat) 
    Mat hsv;
    cvtColor(image, hsv, COLOR_BGR2HSV); //conver BGR to HSV
 
    vector<Mat>  channels;
    split(hsv, channels);    //split channels
    double minVal = 0, maxVal = 0;
    minMaxLoc(channels[0], &minVal, &maxVal, 00);
    cout << "min= " << minVal << " max= " << maxVal << endl//min=0, max=179
    Mat  mask1;   //maxHue 이하는 255, 이상은 0
    threshold(channels[0], mask1, maxHue, 255, THRESH_BINARY_INV);
    Mat  mask2; //minHue 이하는 0, 이상은 255   
    threshold(channels[0], mask2, minHue, 255, THRESH_BINARY);
    Mat hueMask;
    if (minHue < maxHue)  hueMask = mask1 & mask2;
    else hueMask = mask1 | mask2;
    //색상 범위가 0을 포함할 때 즉 160 ~ 10 사이 색상
 
    //채도 마스크
    threshold(channels[1], mask1, maxSat, 255, THRESH_BINARY_INV);
    threshold(channels[1], mask2, minSat, 255, THRESH_BINARY);
 
    Mat satMask;
    satMask = mask1 & mask2;
    //0와 255로 구성된 mask: 255인 곳이 얼굴 영역: 이영역만 원본 영상에서 copy
    mask = hueMask & satMask;
}
 
cs
실행결과:

 

설명:

 

 

 

 

 

'C,C++ > Opencv, c++' 카테고리의 다른 글

Opencv, c++, cvtColor(), split(), merge()  (0) 2019.10.04
Opencv, c++, imshow, imwrite  (0) 2019.10.04
Opencv, c++, video 출력  (0) 2019.09.22
Opencv, c++, Rectangle 출력  (0) 2019.09.22

+ Recent posts