카메라 보정
버드 아이 뷰
이미지 임계값 및 이진 이미지
슬라이딩 윈도우로 차선 위치 파악
파악된 차선 위치 원본 이미지에 표시
카메라 이미지의 목적은 2D 이미지로부터 실제 3D 공간 좌표를 복원하고, 3D로 부터 영상 이미지에 투영된 위치를 파악하기 위함이다.
이 작업에 카메라 내부 기구적 요인(렌즈의 종류, 렌즈와 이미지 센서간의 거리 및 각도 등)이 방해가 될 수 있다.
이를 제거하기 위해 카메라 내부 요인의 파라미터 값을 구하는 과정이 camera calibration이다.
결국 이 파라미터를 이용해 왜곡된 지점을 왜곡되지 않은 지점으로 사상시키는 것 (mapping)
Pin-hole 카메라의 2D perspective projection model로 카메라 내부, 외부 파라미터를 다루는 방법을 설명한 글이 있으니 나중에 관심이 있으면 참고하자. (지금은 활용법을 터득하는게 우선인 듯)
출처: https://darkpgmr.tistory.com/32
(1) 패턴 설치: 대비와 패턴이 강하고 규칙적인 "체스판 이미지"를 사용한다.
(2) 패턴 촬영: 체스판을 다양한 각도와 거리에서 찍는다.
(3) 이미지 전처리: 찍은 이미지 보정, 노이즈 제거 및 코너 검출 등
(4) 내부 파라미터 추정: Calibration에 사용될 intrinsic parameter를 계산한다. (수학적 모델은 찾아보길...)
(5) 외부 파라미터 추정: extrinsic parameter는 카메라 설치 높이, 방향 등 외부적 요인을 말한다.
(6) 파라미터 최적화: 추정된 내, 외부 파라미터를 최적화 한다.
(7) 왜곡 보정: 파라미터로 왜곡을 보정하고 (mapping)
(8) 평가: 결과를 평가한다.
체스판의 코너를 찾는 함수
findChessboardCorners()
체스판의 코너를 그리는 함수
drawChessboardCorners()
camera matrix, skew_c, 회전/변환벡터 반환
cv2.calibrateCamera()
- 나오는 결과값이 무엇인지는 아래 블로그의 이론 참고.
- https://darkpgmr.tistory.com/32
왜곡 된 이미지를 펴주는 함수 (교정)
cv2.undistort()
새가 하늘에서 내려다보듯이 위에서 아래를 내려다 보는 방식
선의 곡률을 측정하기 위해 도로 이미지를 하향식 보기로 변환할 필요가 있다.
(1) 원근변환(perspective tf) 행렬 M을 계산한다.
cv2.getPerspectiveTransform(src, dst)
(2) 역 원근변환을 계산한다.
cv2.getPerspectiveTransofrm(dst, src)
- 단순히 src와 dst 의 위치를 바꾸면 된다.
(3) 원근변환을 사용해서 이미지를 뒤튼다. (원하는 구도로 변환하기 위해)
cv.warpPerspective(img, M, img_size, flags=cv2.INTER_LINEAR)
도로 이미지에 보정, 임계값 및 원근 변환을 적용
차선이 두드러지는 이진 이미지를 얻음
이미지를 기반으로 라인의 일부, 왼쪽/오른쪽 라인 등을 결정해야 함 => 히스토그램 사용
이미지의 각 열(column)의 픽셀 개수를 더하면, 히스토그램에서 차선이라고 의심되는 곳에 peak 가 생성된다.
(흰색이 몰려있으니까 당연히 peak가 생김)
peak가 생긴 곳의 x 좌표를 읽으면, 차선일 가능성이 높은 곳의 위치를 알 수 있음.
python 알고리즘의 일종으로,
고정 사이즈의 윈도우(특정 범위)가 이동하면서 윈도우 내에 있는 데이터를 이용해 문제를 풀이하는 알고리즘이다.
고정적인 범위를 탐색할 때 유리하고, 중복으로 연산을 제거하면서 효율을 높일 수 있다는 장점이 있다.
히스토그램으로 찾아낸 차선 위치 x를 이용한다.
선 중심 주변에 배치된 슬라이딩 윈도우를 사용해 프레임 상단까지 선을 찾아 따라간다.
한 윈도우 안에서 감지되는 선의 중심을 기준으로 계속 윈도우가 쌓인다. (현재 블럭의 중심을 기준으로 새로운 블럭을 쌓아가는 것)
윈도우가 여러 개(사용자 지정 수) 쌓이게 되면, 그 중심을 연결해서 선을 그린다.
Polyfit을 사용하여 2차원으로 표현한다.
(쌍곡선 방정식이 도출된다. ay^2+by+c=x)
2차식의 a, b, c 값을 구해서 polygon을 그린다.






출처: Programmers K-Digital-Training: 자율주행 데브코스 Planning & Control - 차선인식기법 강의