이번 장에서는 openCV에서 특정 색상을 추출할 때 사용되는 inRange를 이용해 차선을 추출하는 예제를 해보겠다 

이전 (9) setMouseCallback을 활용하여 색상의 값을 뽑고 해당 값과 비슷한 색상의 값들을 뽑아 보자

 

1. inRange

  • cv2.inRange(src, lower range, upper range, dst ) 
    - src : 목적이 되는 이미지 
    - lower range : 픽셀의 최솟값 ( 3채널이미지는 (x, x, x) 1 채널은 (x)  ) 
    - upper range : 픽셀의 최댓값
    lower range보다 크고 upper range보다 작은 값에 속하는 픽셀을 뽑아낸다 
import cv2 
import numpy as np 

origin_image = cv2.imread('inrange_image.jpg')

mask = cv2.inRange(origin_image, (0,100,0),(200,255,200))

range_image = cv2.bitwise_and(origin_image, origin_image, mask=mask)

mask = np.stack((mask,)*3, axis=-1)

image = np.concatenate((origin_image, mask, range_image), axis=1)
cv2.imshow('image', image)
cv2.waitKey(0)

 

  • 위의  inRange lower와 upper설정을 보면 값을 사전에 설정하여 입력하였다 
    하지만 위의 사진과 같이 특정 영역을 정확히 뽑아내지 못했다 . 
    inRange의 단점은 이것이다. 특정 객체를 뽑아내려면 해당 객체가 표현하는 색상을 알고 있어야 한다. 
    이럴 때 해당 객체의 색상을 알기 위해 이전 (9) setMouseCallback을 이용하여 색상을 알고 해당 색상에서 일정 범위 안에 해당하는 픽샐들을 뽑으면 객체를 뽑아내기 쉽다 

2. setMouseCallback을 이용한 inRange 

import cv2 
import numpy as np 

def get_RBG_in_image(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONUP:
        print("마우스가 눌린 위치의 BGR값은 : {}".format(param['image'][y,x,:]))

    if event == cv2.EVENT_RBUTTONUP:
        print('마우스오른쪽 버튼이 눌린위치와 비슷한 색상을 가진 픽셀만 뽑기')
        threshold = 20
        value = param['image'][y,x,:]
        mask = cv2.inRange(param['image'],value - threshold, value + threshold )
        range_image = cv2.bitwise_and(param['image'], param['image'], mask=mask)
        cv2.imshow("range_image",range_image)
    return 


origin_image = cv2.imread('inrange_image.jpg')

param = {
    'image' : origin_image
}
cv2.imshow('image', origin_image)
cv2.setMouseCallback('image', get_RBG_in_image, param)
cv2.waitKey(0)

하얀색 방향선을 클릭했을 때 이미지
회색 도로를 클릭했을 떄 이미지

  • setMouseCallback을 설정하여 마우스 왼쪽을 클릭하면 해당 위치에 픽셀의 값을 print 한다 
  • 마우스 오른쪽을 클릭하면 해당 위치의 픽셀과 비슷한 (threashold를 설정) 값을 가지고 있는 픽셀만을 imshow 하였다 
  • 위와 같이 inRange를 이용하여 차량이 진행중에 차선을 검출할 수도 있다 - 조금만 응용하여 동영상에 접목하는 것을 각자 해보자!

+ Recent posts