자율주행

Jupyter OpenCV 차선 인식 V

coding art 2022. 9. 9. 21:39
728x90

이번 장에서는 웹캠에서 촬영하여 저장한 동영상 파일을 사용하여 차선을 인식(인지) 해보자.

 

블로그에 첨부된 lane_detection.ipynb 와 예제 동영상 challenge.avi 를 다운로드 받아 사용자 파일에 함께 저장 후 실행해 보자.

 

헤딩 영역에 라이브러리 OpenCV 즉 cv2 와 numpy를 불러들인다.

 

 

challenge.avi 는 예제 동영상 파일로서 이들과 lane_detection.py 파일은 사용자 폴더에 함께 위치해야 한다.

VideoCapture의 인수 video_src 는 challenge.avi 동영상 파일을 지정한다.

 

 

while True: 문을 사용하여 무한 루프를 사용하여 .read 명령에 의해 VideoCapture()에 의해 지정된 동영상 파일을 읽어서 흑백 처리하자.

 

노란색을 필터링 할 수 있도록 HSV 값의 하한과 상한을 설정하자. HSV는 hue(색상), saturation(채도), value(밝기)를 뜻한다.

원본 이미지 frame 에 해당하는 img를 HSV 처리한다.

노란색 마스크 masky의 범위를 노란색 HSV 상한값과 하한값으로 설정한다.

흑백 마스크 maskw의 범위는 흑백 이미지 gray를 대상으로 설정한다.

노랑 흑백 필터는 각각 8비트로 표현되는 흑백마스크와 노란색 마스크의 비트별 OR 로직으로 설정한다.

 

노랑 흑백 이미지는 흑백 이미지 gray 에 노랑 흑백 필터를 비트별 AND 로직으로 마스크를 씌워 얻어낸다.

 

아울러 노이즈 제거를 위한 blur 명령과 edge를 검출하기 위한 Canny 명령도 적용해 보자. 이 둘다 필터링 작용을 함에 유의하자. 특히 Canny 필터링의 경우 원복 흑백 이미지인 gray 와 어느정도 필터링 된 blur 이미지를 사용하여 결과에서 차이점을 검토해 보자.

GaussianBlur를 적용하기 위한 striding kernel 크기를 NxN 으로 잡게 되면 각 셀별로 중심 점에서 Guassian Weights Probability 계산이 가능하며 이를 셀 값과 곱해서 합산하여 연산한다.

 

 

※ 아래의 GaussianBlur 에서 5 는 시그마 값 즉 표준편차를 의미한다.

 

 

 준비된 마스크를 각종 이미지에 적용해서 필터링된 결과를 얻어내 살펴보자.

 

 

원본 컬러 주행 영상에 대한 흑백 이미지 frame 샘플이다. 흑백 이미지 frame

샘플의 흑백에서 흰색과 회색 검은색을 마스크를 사용하여 필터링 해보자.

 

원본 컬러이미지를 대상으로 노란색 필터를 사용하여 중앙선을 필터링 해 보자.

 

 

흑백 이미지 gray를 대상으로 흰색 필터를 적용해서 필터링한 결과를 살펴보자. 차선과 흰색 차량이 필터링 되었다.

 

흑백이미지를 대상으로 Gaussian Blur를 적용해 보자. 날카롭던 edge 효과가 부드럽게 처리됨을 느낄 수 있는데 이는 노이즈에 의한 날카로움이 제거된 결과라 볼 수 있다. kernel_size를 홀수 값으로 택하여 2차원적으로 중앙 부분이 큰 값을 가지도록 Gaussian 확률 함수를 적용한 결과이다.

 

 

흑백 이미지와 Blur 처리된 이미지를 Canny 처리해 보자. edge를 검출하기 위해서는 밝기 intensity 의 gradient(기울기 변화)를 탐지하여 검출할 수 있도록 최대값과 최소값을 부여해야 한다.

 

원본 흑백 이미지에 대한 Canny 명령에 의한 edge 처리에서는 세부적인 엣지들이 검출되는 반면 Blur 필터링 된 이미지를 사용하는 경우 단순한 형태의 엣지들이 검출됨을 알 수 있다.

 
 

한편 영상 면에 커서를 위치 시킨 후 cv2.wailtkey(1) 즉 키보드로부터 “Q” 또는 “q” 가 입력되는 시점에 동영상이 종료된다.

첨부된 cars.xml, challenge.avi, lane_detection.ipynb 파일을 다운받아 실행해 보자.

cars.xml
0.11MB

 

 

lane_detection.ipynb
0.00MB