ChoiSeongHo-h / ToyLineDetector

고전적인 영상처리 알고리즘을 이용한 차선인식, 제어포인트 출력

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ToyLineDetector

2학년 겨울방학~3학년 1학기에 시도한 터틀봇 opencv를 이용한 간단한 라인 디텍터

태스트 영상 : https://youtu.be/FCIZVF318Fo 원본 영상 : https://youtu.be/Okye6nOlqmA

제목 없음

무한히 뻗은 도로는 지평선 상의 한 점에서 만난다. 우리는 이것을 소실점이라 부른다.

소실점을 통해서 차량의 주행 방향을 결정하고자 한다. 가장 오른쪽 그림에서 짧은 선분은 2개 모두, 차량의 위치와 방향을 나타낸다.

두 선분은 차량의 방향만이 틀어진 경우, 위치만이 틀어진 경우를 나타낸다.

위치가 틀어진 경우 :

이 경우 도로는 가운데 그림과 같이 카메라에 차선이 잡힐 것이다. 차선과 화면의 밑면은 이등변삼각형을 구성한다.

소실점의 x 좌표는 또한 화면의 중앙대비 오른쪽으로 치우쳐있다.

이 경우에 차량은 오른쪽으로 회전해야 한다.

방향이 틀어진 경우 :

차량이 차선에 대해 왼쪽을 바라보고, 차체가 중앙에 위치한 경우를 살펴본다.

이 경우, 도로는 왼쪽 그림과 같이 카메라에 잡힐 것이다.

화면 왼쪽 아래 점과 왼쪽 차선이 화면의 하단과 만나는 점 사이의 간격, 그리고 화면의 오른쪽 아래 점과 오른쪽 차선이 화면의 하단과 만나는 점 사이의 간격이 같음을 알 수 있다.

마찬가지로 소실점의 x 좌표는 오른쪽으로 치우쳐있음을 알 수 있다. 이 경우에서도 차량은 오른쪽으로 회전을 해야 할 것이다.

실제 카메라로 촬영을 해보면 위와 같은 두 경우가 공존할 것이다.

그렇지만 예시처럼 소실점이 오른쪽으로 치우쳐져 있으면 우회전, 왼쪽으로 치우쳐져 있으면 좌회전해야 한다는 사실에는 변함이 없다.

코드를 살펴보고자 한다.

320x240 해상도를 불러온다. 이 영상을 흑백으로 변환하고, 가로방면으로 길게 관심 영역을 설정한다(320x65px).

잡음을 제거하기 위해 각종 필터를 적용하고, 차선을 찾고자 적응형 이진화를 적용한다.

이후 Canny()함수를 적용하여 직선을 강조하고 HoughLinesP() 함수를 통해 직선 중 차선이라 인식될 만한 것을 선분으로 저장한다.

1개 차선에 위 과정을 적용하면 선분이 4개 발생한다. 그렇다면 두 차선에 의해 생기는 소실점의 개수는 4x4=16개다.

따라서 16개의 소실점 중 하나를 선택하여 이를 차량 제어에 사용하여야 하는데 가장 내부 선분들에 의해 만들어진 소실점을 사용하고자 한다.

가장자리에 가까운 선분일수록 각도에 따라, 화면에 잡히지 않을 위험성이 크기 때문이다.

안쪽 선분들에 의해 만들어진 소실점은 다음과 같은 특징을 갖는다.

  1. 소실점 중 y 성분이 가장 클 것이다(OpenCV Mat 자료형은 아래 방향일수록 y 성분이 크다.). 다른 말로 가장 아래 있는 소실점이다.
  2. y 성분은 0보다 작다. 즉, 관심 영역의 위에 존재한다.
  3. 두 선분이 이루는 각은 적당히 크다. 두 차선에 의해 만들어진 직선 8개는 이상적인 경우, 한 점에서 만나야 한다. 그러나 잡음 및 외부 요인으로 그렇지 못하여 한쪽 차선에 의한 소실점만으로 위 두 조건을 만족할 수 있다. 따라서 이를 막고자(서로 다른 차선에 의한 소실점을 찾고자) 두 선분이 이루는 각을 적당히 크게 설정한다.

위 조건들을 만족하는 소실점을 찾고, 그것의 x 성분에서 화면 가로성분의 절반만큼을 빼준다. 그렇게 된다면 값이 음수일 때 좌회전, 양수일 때 우회전한다.

위의 값의 절댓값이 클수록 크게 회전한다.

위와 같이 소실점을 이용한 방법은 차선이 급커브를 만나지 않아 두 개의 차선이 잡힐 때 사용할 수 있는 방법이다.

급커브를 만나는 경우, 하나의 차선만이 잡힐 것이고 소실점은 생성되지 않는다.

이 경우 가장 작은 각을 갖는 두 선분(한 차선에 의해 생성된 선분들은 거의 평행할 것이므로)을 찾아 저장하고,

그것이 왼쪽으로 기울어져 있으면 좌회전, 그렇지 않으면 우회전 신호를 준다.

About

고전적인 영상처리 알고리즘을 이용한 차선인식, 제어포인트 출력


Languages

Language:C++ 100.0%