원근 변환과 슬라이딩 윈도우 기반 차선 인식

  1. Camera Calibration
  2. Bird’s Eye View
  3. 이미지 임계값 및 이진 이미지
  4. 슬라이딩 윈도우로 차선 위치 파악
  5. 파악된 차선 위치 원본 이미지에 표시

Camera Calibration

  • 카메라 보정
    • 카메라는 곡면 렌즈를 사용해서 이미지를 형성해서 가장자리가 왜곡되어 보이게 됨
      • 렌즈, 렌즈-이미지 센서와의 거리, 렌즈와 이미지 센서가 이루는 각도 등 다양한 내부적 요인들로 인해 이미지의 왜곡 발생
    • 물체의 크기, 모양이 변경되기도 하며, 시야의 위치에 따라 모양이 변경되기도 하고 실제보다 더 가깝거나 멀게 보이기도 함
    • 이런 왜곡을 없에고 실제 우리 눈에서 보이는 것과 같게 보정하는 작업(왜곡된 지점을 왜곡되지 않은 지점으로 Mapping)
  • Camera Calibration을 위해 체스판 이미지를 사용
    • 체스판 이미지는 규칙적이고 대비와 패턴이 강해 에러 감지에 용이

image

  • 자동으로 체스 판을 찾아서 패턴을 매핑

    • findChessboardCorners() : 체스판의 코너들을 찾음
    • drawChessboardCorners() : 찾은 체스판의 코너들을 그림
  • 아래 사진을 보면 체스판의 코너들을 찾고 그린 것을 확인할 수 있음

    image

  • 교정 및 undistortion을 계산

    • cv2.calibtrateCamera() : camera matrix, 왜곡 계수, 회전/변환 벡터들을 리턴
    • cv2.undistort() : 이미지를 펴서 왜곡이 없어지게 함(교정)

    • 아래 사진을 보면 살짝 뚱뚱한 체스판이 반듯해짐

image

  • 체스판으로 진행한 Camera Calibration
    • 양쪽으로 볼록한 모양의 체스판이 반듯해짐

image

  • 차선 이미지로 진행한 Camera Calibration
    • 변화된 것이 확 다가오진 않지만 노란색 줄이 좀 반듯해졌고 양쪽으로 볼록한 부분을 펼치다보니, 오른쪽의 차가 잘려나간 것을 확인할 수 있음

image

Bird’s Eye View

  • 새가 하늘에서 내려다보는 듯한 구도로 위에서 아래를 내려다 보는 방식
  • 선의 곡률을 측정하기 위해서 도로 이미지를 하향식 보기로 변환

  • 원근행렬 변환 M을 계산하기 위해 소스 및 대상 지점이 주어지면

    1. cv2.getPerspectiveTransform(src,dst) : 원근변환 행렬을 구하고 이동 전 좌표(src)를 이동 후 좌표(dst)로 투시 변환함

    2. cv2.getPerspectiveTransform(dsr,src) : 역 원근 변환 계산을 함(src와 dst의 값의 위치를 바꿈)

    3. cv2.warpPerspective(img, M, img_size, flags=cv2.INTER_LINEAR) : 앞서 계산한 원근변환의 이미지를 뒤틀어 원하는 구도로 변환함

image

이미지 임계값, 이진 이미지

  • 차선이 명확하게 보이는 이미지를 생성하기 위해서 색상 임계값을 조절
  • 이미지를 흰색과 노란색으로 마스킹
  • Gray Scale로 변환하여 이진 이미지를 생성함

  • HSV
    • H : 색조 S : 채도 V : 명도
    • 명도가 낮을 수록 검은색(0,0,0), 명도가 높고 채도가 낮을 수록 흰색(0,0,100)으로 표현
  • LAB
    • 사람 눈이 감지할 수 있는 색차와 색공간에서 수치로 표현한 색차를 거의 일치시킬 수 있는 색공간
    • L : 명도 A : RED & GREEN 값 B : YELLOW & BLUE 값
    • 노란색 차선을 인식할 때 B 값을 사용하면 좋은 성능을 냄
  • HSL
    • H : 색조 S : 채도 L : 밝기
    • 밝기가 낮을 수록 검은색, 밝기가 높을수록 흰색으로 HSV 와 유사함
    • 흰색 차선을 인식할 때 L 값을 사용하면 좋은 성능을 냄

슬라이딩 윈도우로 차선 위치 파악

  • 히스토그램 방법으로 차선 식별
    • 도로 이미지에 보정, 임계값 및 원근변환을 적용하여 차선이 두드러지는 이진 이미지를 얻음
    • 얻은 이진 이미지에서 어떤 픽셀이 라인의 일부이고, 이게 왼쪽 라인인지 오른쪽 라인인지 결정해야함
    • 각 열에 따라 픽셀 개수를 더하면 히스토그램에서 가장 눈에 띄는 두개의 peark 생성되고, 차선의 x 위치를 파악할 수 있음

image

  • 슬라이딩 윈도우
    • 선 중심 주변에 배치된 슬라이딩 윈도우를 사용하여 프레임 상단까지 선을 찾아 따라 감
    • 한 위도우 안에서 감지되는 선의 중심을 기준으로 계속 윈도우가 쌓임
    • 다음 위도우의 x 값은 현재 위도우 안의 모든 점들의 x 값들의 평균 값으로 그림
    • 슬라이딩 윈도우가 여러개 쌓이면 그 중심을 연결해서 선을 그릴 수 있는데 polyfit을 사용하여 2차원 함수로(ay^2+by^2+c=x) 표현할 수 있음

image

변환 과정 총 정리

  • 오리지널 이미지 Camera Calibration

image

  • Yellow, White 마스킹

image

  • Bird’s Eye View 및 이진화

image

  • 히스토그램 및 Sliding Window, Polyfit으로 2차원 함수 구하기

image

  • 2차원 함수로 Polygon을 그리고 녹색으로 칠하기

image

  • Result 이미지

image