자율주행

OpenCV Hough Transform에 의한 차선 작도 VII

coding art 2022. 9. 13. 20:25
728x90

 

 

이미지 흑백 변환

  grayscale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

RGB 3채널의 컬러 이미지를 grayscale 의 흑백 이미지로 변환할 경우 1채널로 용량이 축소되므로 컴퓨팅 용량의 절감이 가능하다. 특히 흑백으로 변환된 도로 이미지에서도 차선 탐지에 아무런 문제도 없음에 유의하자. 컬러이미지에서 변환된 흑백 이미지는 자연적인 노이즈를 많이 포함하고 있다. 노이즈가 포함된 이미지에서 노이즈를 필터링 하기 위한 이미지 처리 기법으로는 CNN 에 의한 특징 추출 후 다시 역순으로 이미지를 복원할 경우 노이즈 제거가 가능하다.

 

한편 OpenCV 에서는 GaussianBlur 명령을 사용하여 전체 이미지를 다소 흐릿하면서도 부드럽게 만들면 노이즈 제거 효과를 볼 수 있다. 흑백 이미지를 Blur 필터링 처리 후 Canny 명령을 사용하여 주행 차량 앞에 보이는 차선을 포함한 edge 들의 필터링이 가능하다. 이 필터링 결과에서 주행 차선 옆 차선들과 뒷배경을 이루는 산, 오른쪽 숲을 포함하는 부분을 인위적으로 배제할 수 있도록 마름모꼴을 작도하여 마름모 외부의 객체들을 배제 시킬 수 있는 마스크를 만들도록 하자.

 

마름모 꼴 작도에 필요한 꼭지점 좌표는 numpy.array 명령을 사용한다. 앞 사진들의 좌표는 matplotlib 를 사용하여 inline 출력 처리하면 가로축 및 세로축 눈금이 얻어진다. image 파일의 shape[0] 와 shape[1] 은 각각 이미지의 폭과 높이를 나타낸다.

 

  vertices=np.array([[(0,image.shape[0]), (450,310), (490,310), (image.shape[1], image.shape[0])]], dtype=np.int32)

Blur 이미지와 마름모꼴의 꼭지점 좌표를 이용하여 region of interest 처리를 하면 아래 왼쪽 그림이 얻어진다. 유사한 방법으로 Canny 필터링에 의해 얻어진 edges 와 꼭지점 좌표를 이용하면 아래 오른쪽 그림이 얻어진다.

 

  mask = region_of_interest(image, vertices)
masked_edges = region_of_interest(edges, vertices)
print(mask.shape) ; plt.figure(figsize=(10,7))
plt.title("Region of Interest") ; plt.imshow(mask, cmap='Greys_r')
 
 

휴 변환(Hough Transformation) 기법을 사용하여 위 오른쪽 그림에서 검출된 차선에 해당하는 edge 를 찾아 직선의 식으로 표현해 보자. 휴 변환에 의해 직선을 찾기 위한 OpenCV 명령은 Hough_Lines( ) 와 HoughLinesP 2 종류가 있다. 전자는 찾아낸 직선을 (ρ, θ) 값으로 주며 후자는 (x1, y1, x2, y2) 와 같은 좌표값을 제공한다.

 

  rho = 3 ; theta = np.pi/180 ; threshold = 15
min_line_len = 100 ; max_line_gap = 30
lines = hough_lines(masked_edges, rho, theta, threshold, min_line_len, max_line_gap)
 
휴 기법에서는 원 이미지 공간의 픽셀 (x, y)에서 (ρ, θ) 공간으로 변환이 이루어진다. 원 이미지 공간에서 직선형 edge가 발견된 경우 동일 edge 상의 픽셀 점들은 휴 변환에 의해 (ρ, θ) 공간에서 한 점을 지나는 곡선들로 변환된다. 결국 하나의 교점을 통과하는 정현파 곡선들이 되므로 변환 후 (ρ, θ) 공간에서 여러 곡선이 하나의 교점을 지나게 되는 경우를 찾아내면 원 Image space에서의 특정 직선형 edge들을 찾은 것에 해당한다. 특히 휴 변환에 의해서 (ρ, θ) 값을 알아내면 함수 y(x; ρ, θ) 즉 edge의 직선을 구체적으로 결정할 수 있게 된다.

 

 
 

Hough 라인을 찾기 위한 2개의 명령 HoughLines 와 HoughLinesP 가 있다. 두 명령에서 사용되는 인수 파라메터들이 동일하지만 확률적인 접근을 위한 HoughLinesP 에서는 HoughLines 에 비하여 직선을 결정함에 있어서 edge 상의 모든 픽셀들이 아닌 전체 픽셀 들 중에서 무작위적으로 선택된 부분집합 픽셀들을 대상으로 하므로 컴퓨팅 효율이 높다.

아래 그림은 2개의 edge 에 대해서 온른쪽 그림에서 2개의 점들이 대응하며 각 점을 통과하는 수많은 곡선들이 희부옇게 상대적으로 밝게 표현되었다.

 

 

휴 변환에 의해서 이미지에 포함된 edge 들의 직선 방정식이 구체적으로 결정되었으면 아래와 같이 원본 컬러 이미지에 찾아낸 edge 차선을 지정된 색상으로 입혀보자.

 

이번 절의 내용은 아래 Github 싸이트를 참조하여 해설하였다.

참조: Self Driving Nanodegree Program

https://medium.com/mlearning-ai/road-lane-detection-using-opencv-hough-lines-transform-explained-a6c8cfc03f68

 

Github 에서 다운 받은 노트북 파일 중 P1.ipynb 를 실행시켜 보자. 


P1.ipynb
4.50MB

 P1.ipynb 에서 Test on Videos 부분을 실행하기 위해서는 동영상들을 저장하기 위한 폴더들을 준비해 둬야 한다.

 

 

Test_Videos 폴더에는 도전, 좌측 차선, 우측차선 동영상이 사전에 준비되어 있다.

 

아울러 Hough Transformation 처리 후 Test_Videos_Output 폴더에 동영상이 저장된다.

 

아울러 아래의 Github 싸이트에서 zip 코드를 다운받아 압축 해제 후 윈도우즈 10 개인 사용자 폴더에 쥬피터 코드를 실행해 보자.

https://github.com/CesarTrevisan/Finding-Lane-Lines-on-the-Road

 

아래 사이트는 위 싸이트와 유사한 내용을 포함한다.

참조: Simple Lane Detection with OpenCV

https://medium.com/@mrhwick/simple-lane-detection-with-opencv-bfeb6ae54ec0

 

아래 사이트는 휴 변환 이론을 쉽게 해설하고 있는 추천 사이트이다.

참조: Hough Lines Transform Explained

https://tomaszkacmajor.pl/index.php/2017/06/05/hough-lines-transform-explained/