[OpenCV] 8. 영상 내 색상 검출

최재혁·2022년 10월 4일
0

opencv-python

목록 보기
9/10
post-thumbnail

Trackbar를 사용한 hsv영역에서의 색상 추출

색상 boundary 지정 및 mask 검출

cv2.inRange(src, lowerb, upperb) src영상에서 지정한 영역 범위의 값만 추출하는 함수

src(numpy.ndarray) : 소스 영상
lower, upper boundary(scalar, array) : channel 수에 따라 scalar 부터 array까지 지정한다. 범위 내에서 추출한 결과를 mask라고 부른다. mask를 원본 영상과 bitwise_and 연산을 통해 원본에서 마스크의 범위안에 있는 색상을 추출하게 된다.*

Trackbar

Trackbar는 GUI로 실시간으로 파라미터를 조절하여 결과를 볼 수 있게 해준다. count 값을 설정하여 0 ~ count의 범위에서 파라미터를 조절할 수 있다.

영상 이진화

영상의 이진화는 영상을 0과 1로 표현하도록 만드는 것이다. 특징이 있는 부분을 하나의 값인 1로 표현하게 되어 이후 처리를 하는데 편리하다.

cv2.threshold(src, thresh, maxval, type) src영상에서 지정한 type에 따라 이진화를 진행

type :

코드

기능별 코드

  • Trackbar
# Track Bar
win_name = "color_detect_hsv"

def nothing(x):
    pass

def create_trackbar_init():
    # Trackbar를 표시할 윈도우 이름 명시
    cv2.namedWindow(win_name)
    # Trackbar의 변수명, 윈도우 이름과 변수 범위 설정
    cv2.createTrackbar("LH", win_name, 0, 179, nothing)
    cv2.createTrackbar("LS", win_name, 0, 255, nothing)
    cv2.createTrackbar("LV", win_name, 0, 255, nothing)
    cv2.createTrackbar("UH", win_name, 179, 179, nothing)
    cv2.createTrackbar("US", win_name, 255, 255, nothing)
    cv2.createTrackbar("UV", win_name, 255, 255, nothing)

def hsv_track(frame):
    # Trackbar의 조절한 값을 변수에 저장
    Lower_H_Value = cv2.getTrackbarPos("LH", win_name)
    Lower_S_Value = cv2.getTrackbarPos("LS", win_name)
    Lower_V_Value = cv2.getTrackbarPos("LV", win_name)
    Upper_H_Value = cv2.getTrackbarPos("UH", win_name)
    Upper_S_Value = cv2.getTrackbarPos("US", win_name)
    Upper_V_Value = cv2.getTrackbarPos("UV", win_name
  • Mask 지정 및 색상 검출
# mask를 이용한 hsv색영역에서의 색상검출
def hsv_track(frame):
    # 임계값 Boundary 지정 Lowerb, Upperb
    Lower_H_Value = 0  
    Lower_S_Value = 0
    Lower_V_Value = 0

    Upper_H_Value = 179
    Upper_S_Value = 255
    Upper_V_Value = 255
    
    # hsv영역으로의 색영역 전환
    cvt_hsv = cv2.cvtColor(color,cv2.COLOR_BGR2HSV)

    # 임계값 boundary 정의
    lower = np.array([Lower_H_Value,Lower_S_Value,Lower_V_Value])
    upper = np.array([Upper_H_Value,Upper_S_Value,Upper_V_Value])
    mask = cv2.inRange(cvt_hsv, lower, upper)
    
    # 구한 mask와 hsv영상을 연산하여 mask 범위의 색만 추출
    res = cv2.bitwise_and(cvt_hsv,cvt_hsv, mask= mask)

    return res, lower, upper
  • Image Binary화
# 이진화
# 이진화를 위해 1channel 인 grayscale 로 변경
bin = cv2.cvtColor(color_detect_hsv,cv2.COLOR_BGR2GRAY) 

# img binary 화
_, bin_th = cv2.threshold(bin,50,1,cv2.THRESH_BINARY)

전체 예제 코드

import cv2
import numpy as np

path = "D:/dev/wego-project/erp_udp/bookcode/"
image = "hsv.png"
win_name = "color_detect_hsv"

def nothing(x):
    pass

def create_trackbar_init():
    # Trackbar를 표시할 윈도우 이름 명시
    cv2.namedWindow(win_name)
    # Trackbar의 변수명, 윈도우 이름과 변수 범위 설정
    cv2.createTrackbar("LH", win_name, 0, 179, nothing)
    cv2.createTrackbar("LS", win_name, 0, 255, nothing)
    cv2.createTrackbar("LV", win_name, 0, 255, nothing)
    cv2.createTrackbar("UH", win_name, 179, 179, nothing)
    cv2.createTrackbar("US", win_name, 255, 255, nothing)
    cv2.createTrackbar("UV", win_name, 255, 255, nothing)

def hsv_track(frame):
    # Trackbar의 조절한 값을 변수에 저장
    Lower_H_Value = cv2.getTrackbarPos("LH", win_name)
    Lower_S_Value = cv2.getTrackbarPos("LS", win_name)
    Lower_V_Value = cv2.getTrackbarPos("LV", win_name)
    Upper_H_Value = cv2.getTrackbarPos("UH", win_name)
    Upper_S_Value = cv2.getTrackbarPos("US", win_name)
    Upper_V_Value = cv2.getTrackbarPos("UV", win_name)
    
    # hsv영역으로의 색영역 전환
    cvt_hsv = cv2.cvtColor(color,cv2.COLOR_BGR2HSV)

    # 임계값 boundary 정의
    lower = np.array([Lower_H_Value,Lower_S_Value,Lower_V_Value])
    upper = np.array([Upper_H_Value,Upper_S_Value,Upper_V_Value])
    mask = cv2.inRange(cvt_hsv, lower, upper)
    
    # 구한 mask와 hsv영상을 연산하여 mask 범위의 색만 추출
    res = cv2.bitwise_and(cvt_hsv,cvt_hsv, mask= mask)

    return res, lower, upper

if __name__ == "__main__":
    # 영상 불러오기
    color = cv2.resize(cv2.imread(path+image,1),(400,300))

    #########track bar############
    create_trackbar_init()

		#q를 눌러 다음 화면으로 넘어가기
    while cv2.waitKey(1) != ord('q'):

        color_detect_hsv, lower, upper = hsv_track(color)
        conv = cv2.cvtColor(color_detect_hsv,cv2.COLOR_HSV2BGR)

        cv2.imshow("original", color)
        cv2.imshow("color_detect_hsv",color_detect_hsv)
        cv2.imshow("converted",conv)

    cv2.destroyAllWindows()
    ##############################

    # 이진화를 위해 1channel 인 grayscale 로 변경
    bin = cv2.cvtColor(color_detect_hsv,cv2.COLOR_BGR2GRAY) 

    # img binary 화
    _, bin_th = cv2.threshold(bin,50,1,cv2.THRESH_BINARY)

    # 디스플레이
    # np array를 string으로 변경 (디스플레이용)
    lower_string = ','.join(str(e) for e in lower.tolist())
    upper_string = ','.join(str(e) for e in upper.tolist())
    cv2.putText(conv,lower_string,(0,20),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255))
    cv2.putText(conv,upper_string,(0,40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255))
    
    cv2.imshow("converted img",conv)
    cv2.imshow("binary img",bin_th*255)

    cv2.waitKey()
    cv2.destroyAllWindows()

결과

https://youtu.be/Ihgo7NcIrOk

profile
Autonomous driving vision

1개의 댓글

comment-user-thumbnail
2024년 1월 23일

잘봤습니다! 참고하겠습니다!

답글 달기