차선 검출 예제 풀이(작성중)

차선 검출 예제

이번에 해야 할 과제는 차선 검출이었다.
사용 언어 : 파이썬
사용 프로그램 : 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 작업

좋은 웹페이지 즐겨찾기