코드:
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, 160, 10, 25, 166, mask);
Mat detected(image.size(), CV_8UC3, Scalar(0, 0, 0));//하얗게 주려면 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, 0, 0);
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 |