6-13 OpenCV에서 Haarcascade로 자동차는 인식되는데 Lane(차선) Detection은 도대체 어떻게 하는걸까?

in #kr6 years ago (edited)

noname02.png

Pi카메라에서 입력되는 캠코더 영상으로부터 Haarcascade 라이브러리 모듈을 사용하여 사람의 얼굴과 신체 부위들, 고양이 얼굴 및 자동차를 인식할 수 있다. 도로 주행에서 주행 중인 자동차들을 제대로 인식했으면 안전 운전이 가능할까? 우선 차선을 벗어나지 않으면서 주행하려면 반드시 중앙선 포함 차선 인식이 가능해야 하며 앞차를 추월해야할 경우에도 차선 인식(Lane Detection)이 반드시 필요하다.

Haarcascade 라이브러리에 의한 자동차 인식은 특징 추출에 의해서 가능하지만 중앙선이나 차선을 인식하기 위한 haarcascade 라이브러리 모듈이 있을 수는 없다. 차선은 색상과 아주 단순한 기하학적 크기를 가지기는 하지만 여타의 오브젝트와 뚜렷이 구별할 수 있는 특징 추출은 불가능하다. 하지만 중앙선의 경우 노란색, 차선은 흰색이므로 HSV(hue, saturation, value) 즉 색상, 채도, 명도에 의한 컬러 필터링이 가능하므로 Pi카메라가 설치된 라즈베리 파이 보드에서 시뮬레이션용 동영상을 사용해 차선을 인식해보자.

다음의 인터넷 주소를 주소를 방문하여 차선인식에 대한 브리핑 내용을 살펴보고 mp4 형식의 시뮬레이션 고속주행 동영상 화면을 관찰 후 다운받도록 한다.

OpenCV For Lane Detection in Self Driving Cars
https://medium.com/@galen.ballew/opencv-lanedetection-419361364fc0

이 블로그 사이트의 저자가 준비한 동영상이 MP4 이므로 라즈베리 파이 OpenCV에서 실행시키면 특히 너무 높은 해상도로 인해서 큰 화면이 나타나며 거의 정지상태의 “무궁화 꽃이 피었습니다” 수준의 동영상이 관찰된다. 따라서 고해상도 MP4 형식의 동영상으로부터 상당히 낮은 해상도의 동영상 예를 들면 avi 로 변환시킬 필요가 있다.

이러한 영상처리 분야에 관해서는 컴맹 수준이었으므로 yahoo 사이트에서 MP4 to AVI 로 검색하니 많은 사이트가 뜨는데 그 중 가장 만만한 즉 수준이 낮아도 되는 사이트를 찾아서 처리했다. 필자가 찾아낸 가장 무난한(공짜이면서 컴맹도 사용하기 쉬운) 사이트는 www.apowersoft.com 사이트였다. MP4파일을 집어넣고 AVI 로 뽑아내기만 하면 된다. 15M 파일이 1.7M 로 쪼그라 들었으나 라즈베리에서 보기에 아무런 지장이 없다. 가이드 슬쩍 보고 따라 할 수 있는 수준이다. 유튜브에 등록한 avi 변환 파일을 직접 보도록 하자. 노란색 차선과 흰색 차선이 있음을 관찰하자.

이미 변환한 파일을 필자의 블로그 주소에 challenge.avi 로 올려 두었으니 vehicle_masked_detection.py 파일과 함꼐 다운 받아 사용하기 바란다.
만야 스팀잇 사이트가 막혀 있다면 따로 인터넷을 열어 url 주소를 찾아가기 바란다.

http://blog.daum.net/ejleep1/35
이미 블로그에 포스팅했던 Haarcascade 의 cars.xml 라이브러리 모듈을 사용하는 vehicle_detection.py 파이선 코드에 비데오 영상 파일명을 challenge.avi 로 바꾸어주고 haarcascade 라이브러리 cars.xml에 의해 주행하는 차량 인식이 제대로 되는지 관찰해 보자.

noname01.png

이 스크린 캡츄어 화면에서 흰색 차선과 노란색 차선이 있음을 알 수 있다. 이 차선들을 인식하기 위해 컬라 오브젝트를 마스킹해 내는 HSV 기법을 사용해 보도록 하자.
노란색 hue 값의 상하한을 20∼30 범위로 두어 다음과 같이 코딩하자.

lower_yel = np.array[20,100,100]
upper_yel = np.array[30,255,255]
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

saturation(채도) 과 value(명도) 레벨을 100∼255 사이로 두면 아스팔트와 같이 칙칙한 칼라들은 모조리 검정색으로 표현이 된다. 하지만 노란색 차선 조차도 나무 그늘 밑으로 들어가는 경우 value(명도) 레벨이 떨어지므로 희미해지는 수가 있으므로 값 설정에 유의하자.

HUE값에 의한 hsv가 얻어지면 상하한 hue 값을 사용하여 cv2.inRange()명령을 사용하여 mask를 뜨도록 하자. mask를 뜬 화면은 HSV 값 범위에 들어오는 픽셀은 흰색으로 나머지는 검은색으로 표현된다.

masky = cv2.inRange(hsv, lower_yel, upper_yel)
maskw = cv2.inRange(gray, 200, 255)

흰색부분의 mask 작업은 gray 흑백 이미지 파일을 사용하므로 value 레벨값 200∼255를 설정한다.

주행 화면에서 노란색 차선 정보와 흰색 차선 정보가 동시에 필요하므로 binary 파일인 masky와 maskw 파일을 OR 논리로 합산해서 maskyw 이미지 파일을 준비할 필요가 있다.
한편 gray 흑백 이미지와 maskyw 이미지의 AND 논리를 계산해 출력해 보았는데 maskyw 이미지와 약간의 밝기 차이가 있긴 했으나 특별한 정도는 아니었다.

일단 여기까지 마스크 작업을 한 후 5종류의 이미지들을 vehicle_masked_detection.py 코드를 실행 출력해서 비교해 보기 바란다.

cv2.imshow(‘Image’, img)
cv2.imshow(‘Gray’, gray)
cv2.imshow(‘White’, maskw)
cv2.imshow(‘YelORWhi’, maskyw)
cv2.imshow(‘YelANDWhi’, maskyw_image)

noname03.png

도로주행 영상에서 차선인식이 가능하다는 점을 파악했으나 아직 이미지 파일에는 차선 주행을 위해 필요한 정보 이외에도 굳이 필요하지 않은 차선 및 차선 교차점 밖의 정보가 함께 디스플레이 되어 있으므로 이들을 제거하기 위한 일종의 LOW PASS FILTERING 필터링 작업이 필요하게 된다. 다음 블로그에서 이 작업을 위한 GaussianBlur() 명령과 edge 추출을 위한 Canny() 명령의 사용법과 적용에 관해서 알아보기로 한다.

Sort:  

와, 진짜 재밌습니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 취향저격인데요. ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

라즈베리 파이 보드 한벌 준비하시죠!

라즈베리파이는 하나 있습니다. ㅎㅎㅎㅎ

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 65860.84
ETH 3017.19
USDT 1.00
SBD 3.70