opencv- 10일차
Object Detection and Object Tracking Using HSV Color Space
HSV 란 우선 무엇일까
H - Hue = color components (base pigment)
이 범위 안의 색상을 선택함으로서 아무 색상이나 선택할 수 있다
S - Saturation = amount of color (depth of pigment)
V - Value = brightness of the color
RGB 로 표현되는 이미지는 전부 HSV로 표현할 수 있다. Luminensce 인 빛은 매우 중요한 속성이다.
import cv2
import numpy as np
def nothing(x):
pass
cv2.namedWindow('Tracking')
while True:
frame = cv2.imread('smarties.png')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
l_b = np.array([110, 50, 50])
u_b = np.array([130, 255, 255])
mask = cv2.inRange(hsv, l_b, u_b)
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.imshow('frame', frame)
key = cv2.waitKey(1)
if key == 27:
break
cv2.destroyAllWindows()
위의 코드에서 하고 있는 일은 바로 색깔로 해당되는 물체만 탐지하는 것이다.
그러기 위해서는 예를 들어 사진 중에서 파란색상의 공만 탐지하고 싶다면, 해당 색상의 범위를 정해야 하는데
그것은 l_b , u_b (lower bound, upper bound) 로 범위를 정할 수 있다.
그런후 mask 를 지정하는데 이것은 cv2.inRange 메소드를 이용한다.
이전 시간에 배운 biswise_and 메소드를 이용하여 생성된 마스크와 프레임을 앤드 논리 연산시킨다.
4가지 이미지가 출력된다.
그런데 여기서 마스크를 생성하기 위해 우리가 블루 컬러의 로워 바운드와 어퍼 바운드를 직접 지정하는 것이 쉽지 않을 것이다. 그래서 생각해낸 방법이 이전시간에 배운 Track bar 을 이용하는 것이다.
import cv2
import numpy as np
def nothing(x):
pass
cv2.namedWindow('Tracking')
cv2.createTrackbar('LH', 'Tracking', 0, 255, nothing)
cv2.createTrackbar('LS', 'Tracking', 0, 255, nothing)
cv2.createTrackbar('LV', 'Tracking', 0, 255, nothing)
cv2.createTrackbar('UH', 'Tracking', 255, 255, nothing)
cv2.createTrackbar('US', 'Tracking', 255, 255, nothing)
cv2.createTrackbar('UV', 'Tracking', 255, 255, nothing)
while True:
frame = cv2.imread('smarties.png')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
l_h = cv2.getTrackbarPos('LH', 'Tracking')
l_s = cv2.getTrackbarPos('LS', 'Tracking')
l_v = cv2.getTrackbarPos('LV', 'Tracking')
u_h = cv2.getTrackbarPos('UH', 'Tracking')
u_s = cv2.getTrackbarPos('US', 'Tracking')
u_v = cv2.getTrackbarPos('UV', 'Tracking')
l_b = np.array([l_h, l_s, l_v])
u_b = np.array([u_h, u_s, u_v])
mask = cv2.inRange(hsv, l_b, u_b)
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.imshow('frame', frame)
key = cv2.waitKey(1)
if key == 27:
break
cv2.destroyAllWindows()
이렇게 Tracking 창으로 마음대로 LH LS LV UH US UV 를 조절하면 내가 필터하고 싶은 색상의 공들만 출력이 된다.
이미지 말고 영상을 이용해서 HSV Detection을 해봤다. 초록색깔 먼지 떼는거를 한 결과