2017-04-09 21 views
1

cv2.inRange (python 2.7)로 색상을 기반으로 객체 감지를 수행하려고합니다. BGR 색상을 사용할 때 모든 것이 잘 작동하는 것 같습니다. 그러나, 내가 HSV에 BGR 색상을지도, 내가 올바른 마스크를 얻을 수 없습니다. opencv - python - cv2.inRange에서 HSV 색상을 사용할 때 혼란 스럽습니다.

mario_hsv

# first convert the img, and the associated lower and upper bound to HSV 
hsv_img_test = cv2.cvtColor(img_test, cv2.COLOR_BGR2HSV) 
lower_hsv = cv2.cvtColor(np.uint8([[[b-step,g-step,r-step]]]), cv2.COLOR_BGR2HSV) 
upper_hsv = cv2.cvtColor(np.uint8([[[b+step,g+step,r+step]]]), cv2.COLOR_BGR2HSV) 


plt.figure(figsize=(20,10)) 
plt.subplot(1,2,1) 
plt.imshow(cv2.cvtColor(hsv_img_test, cv2.COLOR_BGR2RGB)) 

# apply threshold on hsv image 
mask = cv2.inRange(hsv_img_test, lower_hsv, upper_hsv) 
plt.subplot(1,2,2) 
plt.imshow(mask, cmap='gray') 
HSV

에 BGR

img_test = cv2.imread("test_img/mario.jpeg") 
#define color range for object detection 
step = 10 
r,g,b = 203, 31, 25 #red 
lower_bgr = np.uint8([b-step, g-step, r-step]) 
upper_bgr = np.uint8([b + step, g + step, r + step]) 

# plot mario in BGR and corresponding mask 
plt.figure(figsize=(20,10)) 
plt.subplot(1,2,1) 
plt.imshow(cv2.cvtColor(img_test, cv2.COLOR_BGR2RGB)) 


mask = cv2.inRange(img_test, lower_bgr, upper_bgr) 
plt.subplot(1,2,2) 
plt.imshow(mask, cmap='gray') 

mario_bgr

2) 임계 값 (제대로 작동하지 않는에서

1) 임계 값) .. : 아래의 예를 참조하십시오 . 그것은 분명히 정확하지 않습니다. 코드에서 무엇이 잘못되었는지 파악할 수 없으며, 어떤 도움을 주시면 감사하겠습니다!

답변

1

예상치 못한 동작은 uint8 배열 형식에서 발생하는 것 같습니다. 정확한 이유는 모르지만 부호없는 정수 (예 : 0 - 1 = 255)를 사용하여주의해서 사용해야합니다. 고려하는

# first convert the img to HSV 
img_test_hsv = cv2.cvtColor(img_test, cv2.COLOR_BGR2HSV) 

# convert the target color to HSV 
target_color = np.uint8([[[b, g, r]]]) 
target_color_hsv = cv2.cvtColor(target_color, cv2.COLOR_BGR2HSV) 

# boundaries for Hue define the proper color boundaries, saturation and values can vary a lot 
target_color_h = target_color_hsv[0,0,0] 
tolerance = 2 
lower_hsv = np.array([max(0, target_color_h - tolerance), 10, 10]) 
upper_hsv = np.array([min(179, target_color_h + tolerance), 250, 250]) 

plt.figure(figsize=(20,10)) 
plt.subplot(1,2,1) 
plt.imshow(cv2.cvtColor(img_test_hsv, cv2.COLOR_HSV2RGB)); 

# apply threshold on hsv image 
mask = cv2.inRange(img_test_hsv, lower_hsv, upper_hsv) 
plt.subplot(1,2,2) 
plt.imshow(mask, cmap='gray'); 

다른 점은 서로 다른 색상 공간 RGB와 HSV의 토폴로지의 차이 :

마지막으로 나는 당신이 추구 될 수있는 결과를 얻을 관리 생각합니다. RGB 공간의 상자는 HSV 좌표의 상자로 변환되지 않습니다. 다음의 Wikipedia 기사를 참조하십시오 : HSL ans HSV Color Spaces

+0

'target_color_h '가 서명 된 유형 일 때 작동합니다. 저장면에 있기 위해'max (tolerance, target_color_h) - tolerance'를 사용할 수 있습니다. – Kjell