반응형
코드
#pragma once
#include "Common.h"
//https://docs.opencv.org/3.4/da/d97/tutorial_threshold_inRange.html
using namespace cv;
const int max_value_H = 360 / 2;
const int max_value = 255;
int low_H = 0, low_S = 0, low_V = 0;
int high_H = max_value_H, high_S = max_value, high_V = max_value;
/*//opencv library cvt 코드(BGR->HSV)
//HSV struct
typedef struct {
double h; // Hue (색조) [0, 360]
double s; // Saturation (채도) [0, 1]
double v; // Value (명도) [0, 1]
} HSV;
// RGB를 HSV로 변환
HSV RGBtoHSV(uint8_t r, uint8_t g, uint8_t b) {
HSV hsv;
double min, max, delta;
r /= 255.0;
g /= 255.0;
b /= 255.0;
min = fmin(fmin(r, g), b);
max = fmax(fmax(r, g), b);
hsv.v = max;
delta = max - min;
if (max > 0.0) { hsv.s = delta / max; }
else {
hsv.s = 0.0;
hsv.h = 0.0;
return hsv;
}
if (r == max) { hsv.h = (g - b) / delta; }
else if (g == max) {
hsv.h = 2.0 + (b - r) / delta;
}
else {
hsv.h = 4.0 + (r - g) / delta;
}
hsv.h *= 60.0;
if (hsv.h < 0.0) {
hsv.h += 360.0;
}
return hsv;
}
*/
int main(int argc, char* argv[])
{
Mat frame, frame_HSV, frame_threshold;
while (true) {
std::string fileName = "../KCCImageNet/find_google_area.png";
cv::Mat frame = cv::imread(fileName, cv::ImreadModes::IMREAD_ANYCOLOR);
//cap >> frame;
if (frame.empty())
{
break;
}
// Convert from BGR to HSV colorspace
cvtColor(frame, frame_HSV, COLOR_BGR2HSV); //opencv library cvt 코드(BGR->HSV)
// Detect the object based on HSV Range Values
low_H = 100, high_H = 120;
low_S = 0, high_S = 30;
low_V = 185, high_V = 230;
inRange(frame_HSV, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), frame_threshold);
//threshold 내의 구간에 있으면 관심있는 객체(0 검은색)고 아니면 관심없다.(255흰색)
//영상에 맞게 색깔의 범위를 달리 해줘야함.
char key = (char)waitKey(30);
if (key == 'q' || key == 27)
{
break;
}
}
return 0;
}
코드 중 핵심은
low_H = 100, high_H = 120;
low_S = 0, high_S = 30;
low_V = 185, high_V = 230;
inRange(frame_HSV, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), frame_threshold);
//threshold 내의 구간에 있으면 관심있는 객체(0 검은색)고 아니면 관심없다.(255흰색)
//영상에 맞게 색깔의 범위를 달리 해줘야함.
RGB의 사진을 HSV로 변환한게 frame_HSV인데 여기서 확대해서 자신이 필요로 하거나 필요로 하지 않는 H,S,V의 각각의 값의 범위를 알아내고 threshold에 넣어주게 되면 자신이 필요로 하는 정보만 추출이 되는거임.
noise 가 보이는데 이런 노이즈들을 어떻게 image processing 할 지는 다음 글에서 다룰 예정
반응형
'Open CV' 카테고리의 다른 글
[OPENCV-C++ ] histogram equalization (0) | 2023.11.07 |
---|---|
[OPENCV-C++ ] 영상인식에서 사용하는 색상 모델 (1) | 2023.11.06 |
[OPENCV-C++ ] RGB -> YCbCr-> RGB (0) | 2023.11.06 |
[OPENCV-C++ ] 데이터 최빈값과 제일 적게 나온 값을 기반으로 이미지 픽셀 분석 (0) | 2023.11.06 |
[OPENCV-C++ ] visual studio 환경에서 세팅하기 (0) | 2023.11.03 |