본문 바로가기
Programming/Capstone Design

[Capstone Design]3. 차선 인식(Lane Detection) - 2

by NoiB 2022. 2. 20.
반응형

상당히 오랜만에 쓰는 캡스톤 디자인 포스팅인데요. 너무 오랜만이라 저도 진행상황이 기억이 안나서 몇 번이고 이전 포스팅을 봤습니다. 근황을 간단하게 설명드리자면 이미 캡스톤 디자인은 다 끝이 났습니다. 최종 발표도 약간의 문제가 있었지만 그래도 만족스럽게 마쳤구요. 지금은 취직 준비도 하면서 뭔가 해봐야지 생각이 들면 바로 실행을 해보느라 여유로운 것 같지만 바쁜 그런 이상한 일상을 보내고 있습니다.

 

지난 번 포스팅에서 Canny Edge Detection을 이용해서 해당 장면까지 얻었습니다. 그렇다면 이게 끝일까요? 아닙니다. 해당 사진에는 우리가 관심있는 차선외에도 다른 차량이나 터널의 벽면, 천장, 전등 등이 다 검출이 되어있죠. 이런 상황에서 차선 인식을 하는게 전혀 불가능한 일은 아니겠지만 목표인 차선인식에는 별로 필요 없는 데이터들입니다. 굳이 필요하지도 않은 데이터를 고려하고 있으면 어디선가 에러가 나도 나겠죠. 따라서 저는 이 부분을 관심영역을 정해주는 것으로 필요한 부분만 남기도록 해보겠습니다.

 

관심 영역(ROI, Region of Interest) 설정

사실 제 블로그 외에도 차선 인식 관련해서 적혀있는 글들을 많이 보신 분들이라면 이미 아시는 부분이겠지만 조금 설명을 드리고 넘어가보겠습니다. 관심 영역 설정은 우리가 관심이 있는 영역만, 다시 말하자면 우리가 필요로 하는 부분만을 사용해서 데이터를 처리하기위한 방법입니다. 여기서의 관심영역은 차선 이외에는 아무것도 없는 영역이 되겠죠.

간단하게 나눠보자면 이 부분이 되겠죠. 우리는 관심 영역을 설정해서 앞으로 있을 작업에서 생길 수 있는 오류나 데이터 처리량을 줄일겁니다.

 

하는 이유는 알았으니 이제 실제로 어떻게 하는지를 알아봐야겠죠? 코드를 먼저 보고 설명을 드리겠습니다.

def roi(img):
    mask = np.zeros_like(img)
    h,w = mask.shape
    vertices = np.array([[(w/10,h), (w/10,h*3/4), (w*9/10,h*3/4), (w*9/10,h)]], dtype=np.int32)
    cv2.fillPoly(mask, vertices, 255)
    roi_img = cv2.bitwise_and(img, mask)
    return roi_img

위 함수는 입력 이미지와 같은 빈 이미지를 생성하고, 원본 이미지에서 내가 쓰고자 하는 영역만큼의 마스크를 만들어 비트연산을 통해 관심영역만을 남기는 함수입니다(혹시 이 함수를 사용하실 분은 vertices의 좌표를 조절해서 사용하시면 됩니다. 순서대로 좌하, 좌상, 우상, 우하의 꼭짓점의 좌표를 나타냅니다. 또한 x,y의 좌표계의 원점이 이미지의 맨 왼쪽 위이며 y축의 + 방향이 아랫방향이라는 것을 주의해주세요). 실제로 모든 과정을 이미지화 해보면,

파워포인트로 만들었을 땐 괜찮았는데 어째 올리면 이상해지네요. 화질보다는 과정이 중요하니까요. 아무튼 이런 순서를 거쳐서 roi 이미지가 나오게 됩니다. 실제로 해당 과정을 거친 이미지는 아래와 같습니다.

이제 사진에서 차선이 있는 영역만 뽑아내는 것 까지는 완료했으니 이걸 가지고 어떻게 하면 이후에 있을 작업에 써먹을수있게 가공하는지가 관건이 되겠네요. 아래에 연달아서 작성하기엔 조금 내용이 길어질 것 같으니 다음 포스팅에서 찾아뵙겠습니다.

반응형