cv2.inRange(src, lowerb, upperb) src영상에서 지정한 영역 범위의 값만 추출하는 함수
src(numpy.ndarray) : 소스 영상
lower, upper boundary(scalar, array) : channel 수에 따라 scalar 부터 array까지 지정한다. 범위 내에서 추출한 결과를 mask라고 부른다. mask를 원본 영상과 bitwise_and 연산을 통해 원본에서 마스크의 범위안에 있는 색상을 추출하게 된다.*
Trackbar는 GUI로 실시간으로 파라미터를 조절하여 결과를 볼 수 있게 해준다. count 값을 설정하여 0 ~ count의 범위에서 파라미터를 조절할 수 있다.
영상의 이진화는 영상을 0과 1로 표현하도록 만드는 것이다. 특징이 있는 부분을 하나의 값인 1로 표현하게 되어 이후 처리를 하는데 편리하다.
cv2.threshold(src, thresh, maxval, type) src영상에서 지정한 type에 따라 이진화를 진행
type :
기능별 코드
# 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를 이용한 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
# 이진화
# 이진화를 위해 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()
잘봤습니다! 참고하겠습니다!