자율주행 자동차/인지

차선, 정지선 Detection

이게될까 2024. 5. 8. 13:35
728x90
728x90

차선 : 차가 다니는 길인 차로의 경계를 그어주는 선이다.

사람도 운전할 때 운전자 시야에 있는 차선을 보고 주행 경로를 판단하므로 중요하다!

대회에 나오는 차선, 정지선 인지가 필수인 구간이다.

LKAS

Lane Keeping Assist System의 약자로 차선 유지를 도와주는 시스템이다. 차선을 넘어가면 경고가 나오거나, 스티어링 휠을 제어하여 차선 내부로 돌아가게 도와준다.

대회에서도 차선 유지는 필수다.

 

인지된 차선의 좌표는 아래와 같이 활용된다.

Camera를 통해 얻어온 차선의 2D 좌표(x,y)에는 IPM이 된 좌표이므로 역 변환하여 원본 사진 좌표 값으로 바꾼 뒤, Camera Calibration 값을 활용하여 Camera 기준 좌표로 변환합니다.
Camera 기준 좌표는 ROS TF를 통해 base_link 기준 좌표로 변환되고, LKAS에 사용됩니다.

우리는 총 3개의 차선 인식 방식을 생각해 보았고, 그 중 인식 속도, 연산 량을 제일 중요하게 생각했습니다. 그래서 인식률은 높아도, 속도가 느린 Lidar, Deep learning방식은 제외하고, openCV를 활용하여 빠른 처리 속도를 가진 차선 인식 시스템을 구축하기로 했습니다.

차선 인식 과정!

IPM 변환 사진
IPM(Bird Eye View) 변환 방식

IPM 변환을 통해 원본 이미지의 원근 효과를 제거할 수 있습니다.

첫 번째 과정은 IPM 입니다.
IPM은 카메라로 얻은 원본 이미지의 원근 효과를 제거하기 위해 사용합니다.
IPM을 통해 사진과 같은 Bird Eye View 이미지를 얻습니다.

Bird Eye View 이미지를 얻는 이유는 Bird Eye View 이미지에 있는 차선의 휜 정도를 이용해 차선의 곡률을 계산할 수 있기 때문입니다.
여기서 정확한 곡률 계산을 위해 카메라 캘리브레이션으로 이미지의 왜곡을 제거하는 과정은 필수라고 볼 수 있습니다.
곡률 계산 결과를 이용하면 조향 각을 알 수 있고, 이를 차선 유지 시스템 구현에 사용할 수 있습니다.

이제 색공간을 변환해줍니다. RGB -> HSV

이렇게 변환하여 임계점, Threshold를 잡기도 편해졌습니다.

두 번째 과정은 색공간 변환입니다.

카메라를 통해 얻은 원본 이미지의 색공간은 RGB 색공간입니다.
RGB는 이름에서 쉽게 알아차릴 수 있듯이 빨강, 초록, 파란색의 조합으로 색을 표현하는 색공간입니다.

RGB 색공간은 이 사진과 같이 실제로는 차선의 색이 같은 흰색이지만  햇빛에 반사된 곳과 그림자에 가려진 곳의 RGB 값이 다르게 나오는 단점을 가지고 있습니다.
이와 같이 다른 값을 가지게 되면 원하는 차선 검출에 필요한 적절한 임계치(threshold) 범위를 선정할 수 없습니다.

그래서 RGB 색공간의 단점인 밝기 변화에 대응하기에 부적절하다는 문제를 해결하기 위해 HSV 색공간을 도입했습니다.
HSV 색공간은 밝기(명암) 값의 범위를 설정할 수 있고, 이를 통해 어두운 노란색과 밝은 노란색 모두 단순한 임계치를 통해 검출할 수 있습니다.

이제 이진화를 진행할 것입니다.

grayscale로 변환 후 노란색이나 흰색만 남겨서 남겨둡니다.

 

그리고 히스토그램을 통해 차선 시작 지점을 확인할 수 있씁니다.

세 번째 과정은 이진화 및 히스토그램입니다.
이진화는 그레이스케일 이미지를 흰색과 검은색 2가지로 구성된 이진 이미지로 변환하는 과정을 의미합니다.
여기서 그레이스케일 이미지는 컬러 사진을 흑백 사진으로 변환한 것이라고 생각하시면 됩니다.
앞에서 HSV 색공간으로 변환 후 노란색, 흰색의 범위를 설정해 Gazebo 상에서의 차선을 검출한 것을 확인할 수 있습니다. 

이렇게 인식한 차선 이미지의 히스토그램을 구하면, 차선의 시작점 위치를 파악할 수 있습니다.
여기서 구한 차선의 시작점은 뒤에서 슬라이딩 윈도우를 적용할 때 사용합니다.

 

이제 슬라이딩 윈도우를 통해 차선의 위치를 쭉 파악합니다.

 

슬라이딩 윈도우를 통해 차선 인식을 효율적으로 진행할 수 있습니다.

네 번째 과정은 슬라이딩 윈도우입니다.
슬라이딩 윈도우는 앞에서 히스토그램을 통해 구한 차선의 시작점을 기준으로 윈도우를 쌓아 올리는 과정입니다.

슬라이딩 윈도우 방식을 사용하는 이유는 차선의 구간별로 윈도우를 쌓아 올리므로 곡률이 많은 구간에서의 차선 인식에 효율적이기 때문입니다.

 

정지선 인식과정

HSV변환까지 과정은 똑같습니다.

2024.05.07 - [언어/C] - C 언어 영상처리 - Sobel Filter, 윤곽선 검출, Edge Detection

 

C 언어 영상처리 - Sobel Filter, 윤곽선 검출, Edge Detection

2024.05.02 - [언어/C] - C언어 영상처리 Edge 구하기, threshold 구하기[C언어 영상처리 Edge 구하기, threshold 구하기edge는 명암, 휘도 등이 급격하게 변하는 곳 입니다.만약 물체가 동일한 색 이라면 경계의

yoonschallenge.tistory.com

이 과정과 같은 윤곽선 검출을 진행합니다.

첫번째 과정은 Canny Edge Detection 입니다.
에지는 물체의 윤곽 또는 경계를 나타내는 것입니다.

Canny Edge Detection은 얇고 정확한 에지 검출이 가능하므로, 허프 변환을 위한 전처리 과정으로 수행합니다.

 

확률적 하프 변환을 진행하여 일정 각도, 길이에 맞는 선만 남겨놓습니다.

두 번째 과정은 확률적 허프 변환입니다.
앞의 차선 인식 과정에서 허프 변환이 아닌 슬라이딩 윈도우 방식을 사용하는 이유를 통해 유추할 수 있듯이,
허프 변환은 직선이나 원과 같은 형태의 특징을 추출하는 데 이용합니다.

정지선은 정지선 인식 결과에서 보여지는 것과 같이 일반적으로 가로 방향의 직선이라는 특징을 가지고 있습니다.
그래서 직선을 추출할 수 있고, 연산량을 줄일 수 있는 확률적 허프 변환을 사용했습니다.

현재의 정지선 인식 결과는 정지선 인식 여부만 판단하고 이를 True/False 값으로 출력하지만, 추후에 Calibration을 이용한다면 정지선까지의 거리를 계산할 수 있을 것으로 보입니다.
정지선까지의 거리를 알게 되면, 배달 미션에서 이용할 수 있을 것이라고 생각합니다.

728x90