차선 검출 예제 풀이(작성중)
차선 검출 예제
이번에 해야 할 과제는 차선 검출이었다.
사용 언어 : 파이썬
사용 프로그램 : jupyter lab, anaconda3
아래에는 과제에 대한 자세한 설명을 첨부하였다.
python으로 OpenCV를 사용 하려면 anaconda prompt에서 따로 설치를 해주어야 한다.
cmd에서 아무리 설치를 하려해도 적용이 안된다.
pip install opencv-python
을 입력하여 설치를 해준다.
jupyter lab은 자동완성을 제공하지 않기 때문에 kite라는 파일을 설치하여 자동완성을 사용하였다. 필요한 분들은 참고하기 바란다.
22.04.18 기준 kite는 파일을 제공하지 않기 때문에 구글링을 하여 파일을 구하여 사용하길 바란다.
kite extension 설치 :
jupyterlab 환경에서 kite를 사용하기 위한 extension을 설치하는 방법
jupyterlab의 버전이 3.0이 아닐 경우 3.0 버전 업그레이드 부터 적용시켜 준다.
jupyterlab 버전 업그레이드 방법 : anaconda prompt에pip install jupyterlab==3
을 입력한다.
입력한 다음kite extension
을 설치한다.
jupyterlab 버전 3.0 이상인 경우 : anaconda prompt에pip install "jupyterlab-kite>=2.0.2"
를 입력해주면 jupyterlab에서 kite가 적용된 것을 확인할 수 있다.
동영상에서 차선 검출하기
"road.avi"
동영상에서 차선 검출하기
동영상은 opencv
폴더에서 불러오기
평가기준 :
차선 검출 성능(검출율, 처리 속도 등)
초드 내용(코드에 주석 처리 필수)
제출 서류 :
프로젝트 관련 내용 정리 파일(hwp, doc)
전체 코드 첨부
사용 알고리즘 정리
왜 사용했는지 간략하게 정리
결과 이미지 첨부
어떻게 할건지 생각을 해보았고 다음과 같은 과정을 거쳐 문제를 해결해 볼 것이다.
1. 영상을 불러오기
2. 영상을 Grayscale로 변환(흑백 영상으로 변환)
3. blur 처리를 통하여 noise를 제거 (gaussian blur 사용)
4. canny edge를 통해 선을 검출
5. 선 인지를 위해 ROI를 지정
6. 이미지 비트 연산 적용 (Bit Operation)
7. cv.HoughLinesP를 이용하여 좌표값을 환산
8. Optimization 작업
1. 영상을 불러오기
import cv2
cap = cv2.VideoCapture("./video/road.avi")
if cap.isOpened():
while True:
ret, frame = cap.read()
if ret:
cv2.imshow("Video", frame)
if cv2.waitKey(25) & 0xFF == ord("q"):
print("program has shutdown in purpose")
break
else:
print("no more frame!")
break
cap.release()
cv2.destroyAllWindows()
영상이 나오는 것을 확인할 수 있다.
2. 영상을 Grayscale로 변환(흑백 영상으로 변환)
import cv2
cap = cv2.VideoCapture("./video/road.avi")
if cap.isOpened():
while True:
ret, frame = cap.read()
if ret:
cap_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("Video", cap_gray)
if cv2.waitKey(25) & 0xFF == ord("q"):
print("program has shutdown in purpose")
break
else:
print("no more frame!")
break
cap.release()
cv2.destroyAllWindows()
영상이 흑백으로 된 것을 확인할 수 있다.
3. blur 처리를 통하여 noise를 제거
import cv2
cap = cv2.VideoCapture("./video/road.avi")
if cap.isOpened():
while True:
ret, frame = cap.read()
if ret:
cap_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(cap_gray, (5, 5), 3) # 시그마의 값을 3으로 설정해주었음
cv2.imshow("Video", cap_gray)
cv2.imshow("Video_blur", blur)
if cv2.waitKey(25) & 0xFF == ord("q"):
print("program has shutdown in purpose")
break
else:
print("no more frame!")
break
cap.release()
cv2.destroyAllWindows()
원본 영상보다 흐려진 모습을 볼 수 있다.
canny edge
를 사용하기 위하여 gaussian blur
를 사용하였다.
4. canny edge를 통해 선을 검출
import cv2
import numpy as np
cap = cv2.VideoCapture("./video/road.avi")
if cap.isOpened():
while True:
ret, frame = cap.read()
if ret:
cap_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(cap_gray, (5, 5), 3) # 시그마X의 값을 3으로 설정해주었음
Canny_edge = cv2.Canny(blur, 50, 150)
cv2.imshow("Video", cap_gray)
cv2.imshow("Video_blur", blur)
cv2.imshow("Video_blur_canny", Canny_edge)
if cv2.waitKey(25) & 0xFF == ord("q"):
print("program has shutdown in purpose")
break
else:
print("no more frame!")
break
cap.release()
cv2.destroyAllWindows()
Canny_edge
가 적용된 모습을 볼 수 있다.
minVal
, maxVal
값을 적절히 설정해주어 필요없는 값을 날려야 한다.
5. 선 인지를 위해 ROI를 지정
영상에서 차선의 범위를 지정을 해줘야 계산량이 줄어든다.
그러므로 픽셀의 좌표 값을 알아야 한다.
픽셀의 좌표 값을 알 수 있는 방법
import numpy as np
밑에 import matplotlib.pyplot as plt
를 입력하고, cv2.imshow("Video_blur_Canny_edge", Canny_edge)
아래에 plt.imshow(Canny_edge)
를 입력해 주면 픽셀값을 알 수 있다.
실행하면 위와 같은 그림이 나온다. 이 방법으로 픽셀 값을 찾을 수 있지만, 보다 쉽게 찾는 방법이 있다. Canny_edge
그림을 캡처 하여 그림판으로 가져오면 쉽게 해결할 수 있다.
마우스를 갖다 대면 아래의 사진 처럼 그 위치의 픽셀 값을 알 수 있다.
6. 이미지 비트 연산 적용 (Bit Operation)
7. cv.HoughLinesP를 이용하여 좌표값을
8. Optimization 작업
Author And Source
이 문제에 관하여(차선 검출 예제 풀이(작성중)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@happy5368/차선검출-예제-풀이저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)