OpenCV 차선 인식 (2)

2019. 9. 5. 23:56해봤던것들

Edge 검출을 활용한 차선 인식

HSV, RGB를 통한 차선 인식은 색, 범위를 지정해줘야 하는 문제가 있었고

특히 그림자, 차선이 끊긴 구간에 취약했습니다.

 

문제를 해결하기 위해 Edge 검출을 활용했습니다.

우선 더욱 효과적인 Edge검출을 위해 Gaussian Filter를 사용해서 잡음을 제거했습니다.

잡음이 제거된 영상을 회색화 시킨 후 밝기 평활화를 통해 밝기 값을 추출한 후

Sobel, Canny 두 가지 필터를 사용해 보고, 비교했습니다.

 

Gaussian Filter 적용 전
Gaussian Filter 적용 후
그레이 필터 적용
평활화로 밝기 값 추출

 

먼저 Sobel필터가 대각선에 민감하게 반응하도록

2D Filter에 직접 필터 값을 대입했습니다.

sobelX = np.array([[0, 1, 2],
                   [-1, 0, 1],
                   [-2, -1, 0]])
gx = cv2.filter2D(equ_frame, cv2.CV_32F, sobelX)
sobelY = np.array([[-2, -1, 0],
                   [-1, 0, 1],
                   [0, 1, 2]])
gy = cv2.filter2D(equ_frame, cv2.CV_32F, sobelY)
mag   = cv2.magnitude(gx, gy)

Sobel 필터 적용
Canny 필터 적용

Sobel필터는 선이 뚜렷하고 잘 검출되는 장점이 있었지만

잡음에 약한 Sobel의 특성상 미세하지만 Edge 이외의 곳도 검출되었습니다.

반면에 Canny는 Sobel보다 뚜렷하지는 않지만 Edge 이외의 부분은 전혀 검출되지 않았습니다.


Gaussian Pyramid, V-ROI

검출된 차선들은 실시간으로 처리되기 때문에 데이터의 양이 많고,

차선이 많으면 데이터 처리 속도가 느려지게 됩니다.

 

이런 문제점을 해결해기 위해 Gaussian Pramid를 사용했습니다.

Gaussian Pramid는 Up-Scaling과 Down-Scaling으로 나뉘는데

간단히 말해 영상의 크기를 키우거나 줄이는 것입니다.

 

처리속도를 빠르게 하기 위해 Down-Scaling을 사용했습니다.

가우시안 피라미드 예시

 

ROI는 관심 영역을 의미합니다.

위의 방법을 통해 크기를 줄인 영상의 범위를 Rectangle ROI를 사용해서

영역을 제한해 운전자 주변의 차선만을 인지하도록 했습니다.

차선 검출 성공

 

직사각형 ROI 방식을 이용하여 차선을 인식할 경우, 도로 노면 표시가 없고,

직선의 깔끔한 차선은 잘 탐지되지만, 범위 안에 잡음이나 잘못된 선들이 많을 경우 탐지가 제대로 되지 않습니다.

차선 검출 실패

이러한 문제를 해결하기 위해 Rectangular ROI결정 방식을 개선한 V ROI를 사용하였습니다.

V-ROI 영역은 차선 경계선 부분의 일부 영역만 포함되므로 잡음이나 가로 성분의 선,

또는 잘못된 선이 포함될 가능성이 낮습니다.

 

ROI 좌측
ROI 우측
V-ROI

이후에는 직사각형 ROI 차선 인식과 마찬가지로 CannyHough 변환을 차선을 검출했습니다.

 

횡단보도 구간 검출 성공
그림 구간 검출 성공
글자 구간 검출 성공 


한계점

 본 프로젝트에서는 다양한 Open CV 기법을 통해 차선 검출기를 구현하고 실험을 통해서

정확도와 연산 시간을 단축했습니다. 그러나 광원의 세기와 각도, 바닥 면의 상태 등

다양한 외부 환경의 영향 때문에 Hough변환을 했는데도 불구하고, 실제 적용이 어려웠습니다.

뿐만 아니라 운전자의 주행 습관에 따라 V-ROI 범위 값이 달라지기때문에 정확한 검출은 쉽지 않았습니다


 

Yeowoolee/OpenCV-Lane-Detection

Contribute to Yeowoolee/OpenCV-Lane-Detection development by creating an account on GitHub.

github.com