본문 바로가기
Open CV

[OPENCV-C++ ] HSV threshold 활용해서 원하는 부분만 추출하기

by TYB 2023. 11. 6.
반응형

 

코드

 

#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 할 지는 다음 글에서 다룰 예정

반응형