December 18, 2018

디바이스마트 미디어:

[49호]실시간 영상처리 방식 졸음운전 방지 블랙박스

Cap 2018-07-12 14-10-54-440

  2018 ICT 융합 프로젝트 공모전 최우수상  

실시간 영상처리 방식 졸음운전 방지 블랙박스

글 | 성결대학교 오태식, 여규성, 김성중, 이정희

 

1. 심사평
칩센 보고서가 아주 훌륭합니다. 실제 동일한 기대효과를 가지는 개발이 많이 진행되고 있지만, 블랙박스와 같이 별도 구매 제품에 적용하려고 한 시도가 좋습니다.

뉴티씨 자율 주행이나 ADAS와 같은 시스템처럼, 여기에 필요한 기반기술인 차선인식이나 눈 깜빡임 인식으로, 안전을 보장하는 기능도 최근 블랙박스 등에 많이 탑재되고 있는 핫한 기술입니다. 이를 학생이 직접 세부적인 기술 구현을 통하여, 가능하게 하였다는 점에서 높은 점수를 주었으며, 조금 더 안정성있게 시간을 가지고 개발한다면, 실제 제품으로까지 개발이 가능할 것으로 생각됩니다. 문서작성도 매우 잘하여서, 엔지니어들의 부족한 점인 문서작성 부분에서도 높은 점수를 주었습니다. 최근 졸음운전으로 인한 교통사고가 급증하고 있는 바, 매우 실용적인 작품으로 생각됩니다.

위드로봇 목표, 연구 진행 및 결과에 대한 분석 등이 잘 작성된 프로젝트입니다. 눈 깜박임의 판별의 경우는 편광 필터 사용 및 추가 카메라(적외선) 적용을 추천하며, 차량의 주행 방향은 GPS 정보가 추가로 필요할 것으로 보입니다.

2. 작품 개요
최근 고속도로 교통사고 사망률 조사에 따르면 졸음운전에 의한 사고가 1위를 향하고 있다. 졸음운전에 의한 사고는 내 주변 가족, 친척, 친구 등 얼마든지 일어날 수 있는 사고이다. 사람들은 졸음운전에 대한 위험성과 그에 따른 피해가 얼마나 심각한지 너무나 잘 알고 있기 때문에 기업과 국가에서는 졸음운전에 의한 사고를 예방하고자 하는 여러 제품들과 정책을 세우고 홍보를 하고 있다. 그럼에도 불구하고 졸음운전에 의한 사고는 좀처럼 나아지지 않고 있다.
졸음운전에 의한 사고는 우리나라에서 뿐만 아니라 전 세계 곳곳에서도 일어나고 있다. 졸음은 생물학적인 생리현상이기 때문에 정신을 붙잡는다고 해서 이길 수 있는 것은 아니다. 미국의 도로교통안전국(NHTSA)에 따르면 2005~2009년 사이 전체 사망사고 중 2.2%~2.6%가 졸음운전과 관리되어 있다고 한다. 졸음운전은 운전자의 주의력을 낮추고, 반응시간을 느리게 하며, 운전자의 판단능력에 영향을 주어 심각한 사고를 유발할 가능성이 높기 때문에 미국에서도 다양한 대책이 적용되어왔다.

3. 작품 목표
1. 졸음운전 사망사고율을 1%미만으로 낮춘다.
졸음운전에 의한 사고를 1%미만으로 줄임으로서 많은 사람들이 졸음운전을 예방할 수 있도록 한다.

2. 고급승용차 뿐만 아니라 택시, 버스, 대형 화물차, 지하철 등과 같은 차량에도 설치하여 대중화를 목표로 한다.
현재 시중에 나와 있는 졸음운전시스템은 고급차량의 옵션으로 붙어있거나 33~55만원 사이의 비싼 가격에 팔리고 있다. 그렇기 때문에 하드웨어의 성능을 조금 낮추고 졸음운전을 판단하는 기술력을 상승시킴으로써 싼 가격에 많은 사람들이 이용할 수 있도록 구현한다.

3. 스마트폰과 라즈베리파이를 연동하여 사용함으로서 단일 제품가격을 저렴하게 한다.
한 기기에서만 처리하던 기존 제품들과는 달리 누구나 가지고 있는 스마트폰과 연동하여 처리함으로서 하드웨어적 성능을 낮추고 제품 가격을 저렴하게 한다.
4. OpenCV 방식 영상처리 기술을 통해 정확도 향상시킨다.
영상처리 기술을 통해 차선과 눈 깜빡임을 처리, 정확도를 높이고 하드웨어적인 성능 한계를 소프트웨어 기술을 통해 향상시킨다.

4. 작품 설명
1. 블랙박스의 차선검출 시스템 제작
라즈베리파이의 카메라 센서를 활용하여 차선을 검출한다. 운전자의 차량이 차선을 벗어나게 되면 졸음운전을 하고 있음을 판단한다. 다음의 차선검출을 통한 졸음운전 판단은 1차적인 판단기준에 속한다.

2. 스마트폰을 이용한 눈 깜빡임 검출
최근 스마트폰의 네비게이션 어플리케이션을 활용하는 사람들이 많아지고 있다. 그래서 스마트폰의 카메라를 이용하여 카메라에 사용자의 눈을 인식하도록 하고 만약 사용자가 눈을 감고 있으면 졸음운전을 하고 있음을 판단한다. 다음의 눈 깜빡임을 통한 졸음운전 판단은 2차적인 판단기준에 속한다.

3. 2, 3차사고 방지를 위한 GPS센서 활용과 서버제작
2, 3차 사고를 방지하기 위해 사용자간의 운전 상태에 대한 정보를 공유한다. 하지만 다음의 기능은 졸음운전 방지시스템을 사용하는 사용자가 많아지면 서버를 개방하여 사용할 수 있도록 한다.

4. 사용자의 Application사용 편의성을 위한 NFC(Near Field Communication)기능 제공
매번 차에 앉아서 사람들은 네비게이션을 켜고 또 졸음운전방지 어플리케이션을 켜서 사용해야한다는 불편함을 가지고 있다. 그래서 이러한 불편함을 해소하고자 NFC기능을 추가하여 거치대에 스마트폰을 거치하면 자동으로 어플리케이션이 실행되도록 한다.

5. 주요 동작 및 특징
5.1. 스마트폰 운전자 얼굴 감지
5.1.1. 눈깜빡임 검출 연구 (얼굴 검출)
준비사항
· 사용 기기 : 스마트폰 (SM-G930S 삼성 갤럭시S7)
· 프로그래밍 언어 : 자바
· 영상처리 api : OpenCV 3.0.0_android

개요

2018 ict _ 최우수상 (1)

· 얼굴로서의 특징을 모두 가지고 있다.
· 처음부터 종료시까지 계속 눈을 감고 있지 않는다.
설계 과정

2018 ict _ 최우수상 (2)

눈깜빡임 검출 구현 알고리즘

1. 흑백 변환
CvCameraViewFrame 객체의 프레임을 흑백으로 저장하는 gray 메소드 사용
2. lbp cascade를 이용하여 얼굴 검출
detectMultiScale 메소드를 이용하여 검출 감지된 얼굴 좌표는 MatOfRect형 변수로 저장된다.
3. 눈 영역 추출
얼굴 좌표에서 ( 얼굴의 위 좌표 + 얼굴 높이 / 4.5 ) ~ ( 얼굴 위 좌표 + 얼굴 높이 / 3.0 ) 에 눈이 있다고 가정
4. harrcascade를 이용 하여 눈 검출
detectMultiScale 메소드를 검출 신뢰성을 향상시키기 위해 여러번 검출 후 정렬하여 가장 크고 작은 값들(오검출이라 예상되는 값)을 제외하고 평균을 내서 눈의 위치를 확정 얼굴의 위치와 각도등의 변경을 대처하기 위해 옵티컬 플로우(루카스 카나데)를 사용하여 눈의 위치 추적 사용하는 메소드 calcOpticalFlowPyrLK()
5. 눈주변을 canny 변환
canny 메소드를 이용하여 canny 변환 Mat형 변수로 저장된다.
6. 허프 변환으로 기울기 계산
HoughLines 메소드를 이용하여 허프 변환 얼굴의 너비에 따라서 최소 선분 길이 지정 기울기에 따라 다른 값 저장

5.1.2. 처리 이미지 크기 조정
개요
처리 이미지를 960 X 비율에 맞는 세로로 resize해 사용함으로서 초당 프레임 상승을 기대한다.

2018 ict _ 최우수상 (3)

설계 과정
얼굴 검출을 제외한(얼굴 검출 시에는 480 X (비율에 맞는 세로 크기) 사용) 얼굴 추적, 눈 검출, 눈 깜빡임 검출에 쓰이는 이미지를 960 X (비율에 맞는 세로 크기)로 맞춘다.

구현

2018 ict _ 최우수상 (5)
결과

2018 ict _ 최우수상 (4)

초당 프레임이 2~3 프레임에서 5~6 프레임 증가하였다

5.1.3. 얼굴 크기 및 회전 보정
개요
처리할 얼굴 이미지를 (480 X 비율에 맞는 세로)로 resize하고 회전을 보정받음으로서 눈 검출 및 템플릿 매칭, 개폐판단을 보완한다.

2018 ict _ 최우수상 (1)

설계 과정
얼굴 이미지를 새로 만들어 (480 X (비율에 맞는 세로 크기) )로 resize 후 회전 보정한다.

구현
1. 랜드마크의 각도를 정렬하고 오차라 판단하는 앞뒤 각각 3개씩을 제외한 값을 평균을 내어 저장한다.

2018 ict _ 최우수상 (6)

2. getRotationMatrix2D를 통해 2D 변환식을 저장한 후 warpAffine을 통해 회전 변환을 적용한다.

2018 ict _ 최우수상 (7)

3. 크기를 보정한다.

2018 ict _ 최우수상 (8)

결과
·크기 고정 및 회전 보정을 하였다.

2018 ict _ 최우수상 (9)

5.1.4. 얼굴 배경 제거
개요
히스토그램 평활화를 할 때 외부 배경의 밝기에 영향을 받지 않고 외부가 밝든 어둡든 얼굴 밝기를 항상 비슷하게 유지하기 위하여 배경을 제거한다. 또한 눈 검출 및 매칭, 기울기 판단 시에도 좋은 영향을 준다.

2018 ict _ 최우수상 (2)

설계과정
얼굴 윤곽 안쪽만 투명한 이미지와 원본 이미지를 배열곱하여 배경을 제거한다.

구현
1. 얼굴 윤곽을 잡아낸다.

2018 ict _ 최우수상 (10)

2. fillConexPoly 함수로 얼굴 영역만 투명한 8비트 4채널 이미지와 원본을 8비트 4채널로 변환한 이미지를 준비한다.

2018 ict _ 최우수상 (11)

3. 배열곱을 한 후 1채널 gray로 변환한다.

2018 ict _ 최우수상 (12)

4. 얼굴 영역만 깊은복사를 하고 평활화를 한다.

2018 ict _ 최우수상 (13)

결과
얼굴 이미지의 배경을 제거 히스토그램 평활화

2018 ict _ 최우수상 (14)

5.1.5. 눈 검출 후 템플릿 수집
개요
눈 템플릿을 만든 후 각도와 좌표를 저장한다.

2018 ict _ 최우수상 (15)

설계 과정
Harr 검출로 눈을 검출한 후 템플릿을 수집하고 템플릿들을 히스토그램 비교를 이용하여 오류를 배제, 템플릿들의 좌표와 각도를 수집하여 템플릿 매칭에 쓰일 템플릿, 템플릿 매칭 오류를 보정해줄 눈 좌표, 눈 깜빡임 판별을 위해 눈을 떴을 경우 각도를 정한다.

구현
1. 눈을 검출한다.

2018 ict _ 최우수상 (24)

2. 템플릿을 20개 정도 수집한다. 이때 정규화한 히스토그램 값과 중심 좌표 값을 같이 저장한다.
3. 각 값들에 대한 히스토그램을 비교한다.

2018 ict _ 최우수상 (17)
좌표값과 각도의 평균, 가장 유사도가 높은 템플릿을 저장한다.
2018 ict _ 최우수상 (18)

결과
눈의 템플릿을 만들었다.

2018 ict _ 최우수상 (19)

5.1.6. 눈의 각도 측정
개요
눈의 각도를 측정한다.

2018 ict _ 최우수상 (20)

설계 과정
가우시안 블러로 잡음을 제거한 후 케니엣지를 통해 엣지를 구한다. 허프라인을 통해 선을 찾은 후 각도를 측정한다.

구현
1. 잡음 제거 후 케니엣지로 엣지를 구하고 허프라인으로 선 반환을 받는다. 그 후 각도를 저장한다.

2018 ict _ 최우수상 (21)
2. 저장한 각도를 0 ~ 90도 사이로 변환하고 각도를 정렬 후 앞 10% 뒤 10%를 제외한 값을 평균을 내어 저장한다.

결과
각도를 측정, 저장하였다.

2018 ict _ 최우수상 (22)

5.1.7. 템플릿 매칭
개요
템플릿 매칭을 이용하여 눈을 찾는다.

2018 ict _ 최우수상 (23)

설계 과정
템플릿 매칭은 회전과 크기, 조명 변화에 민감하지만 회전과 크기 보정, 배경 제거 후 히스토그램 평활화를 하였기 때문에 검출률을 상당히 높일 수 있었다. 나머지 잔 오검출을 제외하기 위하여 템플릿 선정에서 얻은 좌표값을 이용하여 보정하여 눈의 검출을 완벽히 한다.

구현
1. TM_SQDIFF 방식으로 유사 템플릿을 찾는다.

2018 ict _ 최우수상 (24)
2. 좌표값의 차이가 너무 클 경우 (눈을 감을 경우 템플릿 유사도가 크게 달라지기 때문에 오검출이 일어날 경우가 있음) 기존 템플릿의 위치에 의존하여 눈을 찾는다.

2018 ict _ 최우수상 (25)

결과
템플릿 매칭을 이용해 눈을 찾았다.

2018 ict _ 최우수상 (26)

5.2. 블랙박스 “도로 차선 감지”
5.2.1. 차선 이탈 감지 시스템 구현
1. 차선 인식

2018 ict _ 최우수상 (27)

[차선의 종류] (경부고속도로 상부)
① : 흰색 차선(일반)
② : 황색 차선(중앙/끝)
③ : 청색 차선(버스전용)
차선을 인식하기 위해서는 먼저 차선의 특징을 알 필요가 있다. 졸음운전이 일어나기 쉬운 고속도로에 존재하는 차선은 흰색, 황색, 청색이 있다. 3가지 종류의 차선을 특정하기 위하여 영상에서 흰색, 황색, 청색 영역을 추출한다.

2018 ict _ 최우수상 (28)

[흰색 영역 추출] ·흰 영역을 추출하였을 때 차선이 아닌 다른 부분도 추출됨을 볼 수 있다.

2018 ict _ 최우수상 (29)

[차선 특정] ·색 영역을 추출하여 얻어낸 데이터를 바탕으로 차선으로 추정되는 객체를 특정한다.

5.2.2. 차선 검출 구현
준비 사항
· 사용 기기 : RaspberryPi 3, Logitech Webcam C270
· 프로그래밍 언어 : C++
· 영상처리 api : OpenCV 3.1.0

개요

2018 ict _ 최우수상 (3)

위와 같은 풍경이 펼쳐지고 있을 때, 차선만을 검출하는 방법에 대하여 설명한다.
· 일반적인 도로의 모습에서 차선의 특징을 정의 한다.
· 차선의 색은 흰색, 노란색이고, 도로의 색(아스팔트)과 큰 차이가 난다.
· 차선은 일정한 두께가 있다.
· 차선들은 하나의 소실점에서 만난다.

설계 과정

2018 ict _ 최우수상 (30)

차선 검출 구현 알고리즘

1. Gray Scale 변환
·cv::cvtColor 사용 Gray Scale 변환
·0~1(float)scale cv::Mat.convertTo 사용

2. edge 크기 검출
· cv::Sobel 함수로 x축, y축으로 미분
·cv::cartToPolar 함수에 x/y축으로 미분한 값을 넣어 edge의 크기(magnitude)와 방향(orientation)을 구한다.

3. 객체 최대치 검출
·magnitude의 정보가 담긴 값 중에left < middle > right 가 되는 middle 값만 추출

4. 차선 후보 검출
·영상의 아래쪽으로 갈수록 커지고 위로 갈수록 작아지는 최저 차선폭을 지정
· 같은 y값을 가지는 인접한 두 지점간 거리와 해당되는 y축의 최저 차선폭을 비교.
· 두 지점의 magnitude값이 유사 검사.
· 위 조건을 만족 시 두 지점의 orientation값이 160~200도 차이가 나는지 비교한다.
· 모든 조건을 만족하면 두 지점의 중심점을 차선 후보 점으로 지정한다.

5. 선 검출
· cv::HoughLinesP 함수에 이전 연산의 결과로 나온 객체를 입력하여 직선 좌표값을 뽑아낸다.

6. 소실점 계산
· RANSAC 알고리즘으로 소실점을 찾는다.
· 소실점으로 향하는 직선만 차선으로 인정.

2018 ict _ 최우수상 (4)

5.2.3. 차선 검출 속도 향상을 위한 관심영역 지정

2018 ict _ 최우수상 (31)
개요
차선 검출 시에 연산하는 영역을 촬영 영상 중 실제 도로가 속해 있는 영역으로만 강제 하여(관심 영역 지정) 연산 속도를 향상시킨다.

설계 과정

2018 ict _ 최우수상 (32)

영상의 상단 30%는 지평선의 윗부분으로 간주한다.
영상의 하단 10%는 차량의 본넷 부분으로 간주한다.
나머지 중간 영역을 관심 영역으로 지정하여 연산한다.

구현
관심 영역의 사각형 객체를 이용하여 일부분만 다룬다. 차선 검출 속도 향상을 위한 관심 영역 지정

2018 ict _ 최우수상 (33)

결과

2018 ict _ 최우수상 (34)
상단 : 원본, 하단 : 관심 영역
원본에서 관심 영역을 설정한 것을 알 수 있다.
차선 검출 속도 향상을 위한 관심 영역 지정

2018 ict _ 최우수상 (35)

좌측 : 영역을 연산 시 소비클록, 우측 : 관심 영역을 연산 시 소비클록(약 1/3의 연산 시간의 절약이 있었다.)

문제점

2018 ict _ 최우수상 (36)
좌측 : 정상 각도, 우측 : 비정상 각도
관심 영역 도로가 들어올 수 있게 카메라의 각도를 조정

5.2.4. 차량의 차선 이탈 감지

2018 ict _ 최우수상 (37)
개요
올바른 주행이 아닌 상태는 두 가지로 볼 수 있다.
① 좌측 상황 : 차량이 차선 내부에 있지만 차량의 주행 방향과 차선의 방향이 일치하지 않다.
② 우측 상황 : 차량이 차선을 밟고 있다.

설계 과정
① 상황을 감지하기 위해서 필요한 요소는 아래와 같다.
1. 차량의 주행 방향 2. 차선의 방향
나머지 요소인 차량의 주행 방향을 알기 위해서 다양한 방식을 적용할 수 있다.
· 차량 전륜의 방향을 알아낸다.
· 자이로스코프 센서를 부착하여 데이터를 분석한다.
· 영상처리로 알아낸다.
이 중 2가지 방법은 추가 하드웨어 요소를 필요로 한다,

② 상황을 감지하기 위해서 필요한 요소는 아래와 같다.
1. 차선의 위치 2. 차량의 위치
사전에 영상에서 차선을 검출하였기 때문에 차선의 위치는 쉽게 알 수 있다.
· 차량의 위치를 촬영하고 있는 블랙박스의 위치이다.
· 우리는 상대적으로 어렵다고 예상되는 ②번 상황을 우선적으로 구현하기로 하였다.

2018 ict _ 최우수상 (38)

②번 영역의 중앙에 특별한 영역(노란색 영역)을 만든다.

2018 ict _ 최우수상 (39)

영상에서 차선객체의 중점(파란색 점)을 가져온다.
· 노이즈 객체들을 분별하기 위하여 길이를 정의한다.
· 관심 영역의 절반의 대각선 길이(노란선의 길이)를 100%로 잡고 비교하여 20% 이상의 길이를 가지는 객체를 차선으로 인정한다.

2018 ict _ 최우수상 (41)
· 지정한 특별 영역에 있는 객체들의 길이를 알아 낸 뒤,
합이 20% 이상이 되면 차량이 경고를 판별한다.
(예시 : 노란색 영역에 중점이 있는 차선 객체 길이의 합이 28%(20% 이상) 차량이 차선을 밟았다고 판별함)

구현
관심영역에 특별영역을 만들고 100%의 기준이 되는 선의 길이를 구한다.

2018 ict _ 최우수상 (42)

특별영역에 들어온 차선을 판별한다.

2018 ict _ 최우수상 (43)

길이의 총합이 20%가 넘는 경우가 연속해서 5번 생기면, BlueTooth가 연결된 기기에 detect 신호를 송신한다.

2018 ict _ 최우수상 (44)

결과
관심 영역의 차선이 중앙에 있을 시에 감지를 한다.

2018 ict _ 최우수상 (45)

5.3. 스마트폰 거치(NFC)

2018 ict _ 최우수상 (46)

5.3.1. 네트워크 통신 구현
준비 사항
· 사용 기기 : 스마트폰
· 프로그래밍 언어 : 자바
· 통신 방식 : FCM (FireBase Cloud Message)

개요
라즈베리파이와 안드로이드 간의 통신 연구로 새로운 통신 방식을 조사하여 데이터를 주고 받아본다. FCM이라는 클라우드 메시지 방식을 테스트해본다.

2018 ict _ 최우수상 (47)

FCM 설명
메시지를 무료로 안정적으로 전송해줄 수 있는 하나의 메시지 전송 시스템의 장점으로는 1. 서버를 따로 만들 필요 없이 클라이언트만 제작하여 메시지를 주고받을 수 있는 시스템, 2. 쉽고 빠르게 구현, 3. 앱의 사용자가 많아진다면 서버코드를 확장하지 않고도 알아서 처리가 있다.

특징
· 저장된 양의 데이터를 통계적으로 볼 수 있다.
· 테스트 메시지를 보낼 수 있어 테스트가 편리하다.

2018 ict _ 최우수상 (48)

설계과정
1. 안드로이드 app에 firebase를 추가한다. (패키지 이름, 앱 닉네임, 빈칸)
2.자동적으로 google-services.json이 다운로드되면 프로젝트의 메니페스트가 있는 경로에 복사한다.
3.서버에 프로젝트를 등록하고 sener ID와 server KEY를 얻는다. (Project > Settings > Cloud Messaging에서 체크)
4. 프로젝트 수준과 앱 수준의 gradle을 전부 설정해준다.

2018 ict _ 최우수상 (49)
5. 각 기기가 서버에 접속할 수 있게 토큰을 생성해준다.

2018 ict _ 최우수상 (50)
6. 메시지 수신 시 이벤트로 노티피케이션과 진동을 준다.
7. 메시지 송신 시 서버로 메시지를 전송한다.

5.3.2. FCM 구현 알고리즘
1. 토큰 생성
· 서버에서 해당 프로젝트의 어플 사용자임을 인증하고 토큰을 받는다.
· FirebaseInstanceId.getInstance().getToken() 메소드 이용 해당 기기의 토큰을 생성한다.
· okhttp3의 Request 메소드를 이용하여 토큰을 서버에 전송한다.
2. msg수신
· notificationManager.메소드를 이용하여 받은 메시지를 띄운다
· Vibrator로 진동을 준다.
3. msg송신
· databaseReference.메소드를 이용하여 서버의 데이터베이스에 메시지를 쓴다.

5.3.3. 라즈베리파이(블랙박스)와 안드로이드간의 블루투스 통신
구현
· 라즈베리파이의 라이언트를 accept, 정보를 상시 수신한다.

2018 ict _ 최우수상 (51)

· 차선 이탈을 감지시, 클라이언트에 detect 신호 송신한다.

2018 ict _ 최우수상 (52)

· 안드로이드 어플리케이션에서 사전에 페어링된 기기 리스트를 받아서, Spinner에 배치한다. Spinner에서 선택된 블루투스 기기(라즈베리파이)에 접속을 준비한다.

2018 ict _ 최우수상 (53)

· 서버(라즈베리파이)에 접속, I/OStream을 열고 통신한다.

2018 ict _ 최우수상 (54)

· 스레드를 생성 후 서버에서 보내는 값을 항상 체크한다.
· 서버에서 detect 신호를 보내주면 알람(진동)을 울린다.

2018 ict _ 최우수상 (55)

결과

2018 ict _ 최우수상 (5)
라즈베리파이(서버)에서 소켓을 만들고 listen, accept하는 것을 볼 수 있다.

2018 ict _ 최우수상 (56)
안드로이드 어플리케이션(클라이언트)에서 1. 접속할 기기를 선택 2. 서버(라즈베리파이)에 접속 3. detect 신호를 수신하여 텍스트로 출력한다.

5.3.4. 서버와 통신 – 알림
개요
졸음운전 판단 시 알림을 준다.

설계과정
1. 사용자가 졸음운전을 하고 있다고 판단이 되는 경우 알림을 재생한다.

2018 ict _ 최우수상 (57)
2. 사용자가 알람을 들을 경우 버튼을 눌러서 알람을 중지한다.

2018 ict _ 최우수상 (58)

 

구현
이벤트가 발생할 때마다 알람이 울려야 되기 때문에 이벤트 발생 지점으로부터 Media Player를 생성한다.
GPS가 동작하지 않거나 GPS 신호를 받을 수 없더라도 졸음운전이라는 판단이 날 경우 알람을 울리도록 구현한다.
1. 사용자가 졸음운전을 하고 있다고 판단이 되는 경우 알림 재생한다.
2. 사용자가 알람을 들을 경우 버튼을 눌러서 알람을 중지한다.

5.3.5. FCM 서버등록
개요
졸음운전의 2, 3차 사고방지를 위하여 FCM을 이용하여 서버를 구축하고 졸음운전자가 있다는 메시지를 실시간으로 알려주기 위해 사용한다.

구현
[1] Firebase홈페이지에서 프로젝트를 생성

2018 ict _ 최우수상 (59)

[2] android앱에 Firebase를 추가하기 위한 작업을 수행한다.
(1) 안드로이드의 패키지 이름을 등록 한다.
(2) google-service.json을 다운로드받고 파일을 안드로이드에 복사한다.
(3) App수준의 build.gradle에 아래 문구를 추가한다.

2018 ict _ 최우수상 (61)
(4) project수준의 build.gradle에 다음과 같이 추가

2018 ict _ 최우수상 (62)

2018 ict _ 최우수상 (63)
Firebase를 사용하기 위한 서버를 구축하였다.

5.3.6. FCM DataBase sating & GPS, Date
개요
FCM서버와 클라이언트가 서로 통신하기 위해서 Database가 필요하다 이곳의 Database에는 졸음운전자의 위치와 시간정보를 받아 다른 사용자들에게 실시간으로 메시지를 전송해 준다.

2018 ict _ 최우수상 (64)

구현
[1] Database를 사용하기 위해 규칙을 설정한다.

[2]데이터베이스에 내용을 전송하기 위해 어플리케이션에서 소스코드를 작성한다.
(1) 데이터베이스에 내용을 보낼 빈 생성자를 만든다. 이때 생성자 안에는 GPS의 정보와 날짜와 시간의 정보가 담겨있다.
(2) GPS 위치정보 받아오기 위한 소스코드

2018 ict _ 최우수상 (65)

(3) 날짜와 시간정보를 받아오기 위한 소스코드

2018 ict _ 최우수상 (66)
(4) 위치정보와 시간정보를 데이터베이스에 전송하기 위한 소스코드

2018 ict _ 최우수상 (67)

 

[3] firebase에 올린 데이터 정보를 받기 위해서 수신 메시지 소스를 작성한다.

문제점
위도와 경도의 정보를 그대로 사용할 수 없다. 또한 GPS를 켜지 않은 상태에서 메시지를 전송할 경우 Database에 잘못된 정보가 올라가게 되어 앱이 설치되어있는 모든 앱이 다운되는 현상이 발생한다.

결과
스마트폰의 상단 바에 졸음운전자가 있음을 알리는 메시지를 전송한다.

2018 ict _ 최우수상 (68)

6. 전체 시스템 구성

2018 ict _ 최우수상 (69)
6.1. 눈 깜빡임 검출 연구 결과
6.1.1. 문제점 분석 및 해결방안

2018 ict _ 최우수상 (70)

6.1.2. 차선 검출 연구 결과
실제 Webcam을 사용한 실험 결과

2018 ict _ 최우수상 (71)

6.2. 스마트폰 어플리케이션 연구 결과
6.2.1. 오버레이 뷰 구현
개요
운전중에 스마트폰 네비게이션앱을 사용자하는 운전자가 많다.
타사 앱 위 오버레이 창을 올려 앱의 유연성을 높인다.

2018 ict _ 최우수상 (72)

설명

2018 ict _ 최우수상 (73)

· 좌측 영역 : 전면카메라의 프리뷰
· 경고 수치 : 경고 정보 스택. 오버플로우시 경고가 울린다.
· 차선이탈 : 블랙박스에서 받은 차선이탈 정보 알림
· 눈 감음 : 전면카메라를 영상 처리한 결과 눈 감음 알림
· BT 연결 : 블랙박스와의 연결 상태
· 차선인식 : 블랙박스의 차선인식 원활상태
· 카메라 : 전면카메라의 사용자 얼굴 인식 상태
· 연결된 기기 : 블루투스로 연결된 기기의 이름

구현
· 서비스 매니저를 불러서 뷰의 권한을 가지고 온다.

2018 ict _ 최우수상 (74)

2018 ict _ 최우수상 (75)

결과
다른 어플리케이션 위에 오버레이 뷰가 실행된다.
오버레이 뷰를 터치시 여러 기능이 실행된다.

2018 ict _ 최우수상 (76)

· 더블클릭 : 앱으로 복귀한다.
· 롱 크릭 & 드래그 : 오버레이 뷰를 이동한다.

6.2.2. 오버레이 뷰를 통한 전면 카메라 영상처리 백그라운드 화
개요
안드로이드에서 카메라를 사용하려면 카메라 프리뷰가 활성화 되어 있어야 하는데, 액티비티가 백그라운드화 되면 프리뷰가 활성화 되지 않아 카메라를 사용할 수가 없다. 이에 백그라운드에서 돌아가는 기존의 오버레이 뷰 서비스에 카메라 기능을 추가하여 카메라를 언제나 사용할수 있게 한다.

설계 과정
오버레이 뷰 서비스에 카메라 사용, 영상처리 기능을 추가하여 프리뷰를 오버레이 뷰 또는 프리뷰를 감추어 놓고 카메라를 이용하게 한다.

구현

2018 ict _ 최우수상 (77)
카메라 초기 설정을 마친 뒤 프리뷰를 뿌려줄 뷰 클래스를 지정하여 프리뷰를 시작한다.
프리뷰가 갱신될 때 실행되는 PreviewCallback 클래스를 생성한다. 받아온 영상정보를 영상처리를 위한 Mat 객체로 만든다. 이후에 영상처리 과정을 시작한다.

2018 ict _ 최우수상 (78)

결과
카메라를 서비스에서 실행하여 액티비티와 무관하게 실행한다. 설정을 주어 카메라 프리뷰를 보이지 않아도 카메라를 사용할 수 있다.

2018 ict _ 최우수상 (79)

6.2.3. 차선이탈 감지 / 눈 감음 감지 정보의 융합
개요
블랙박스에서 받은 차선이탈 감지 정보, 전면카메라 영상처리에서 얻은 눈 감음 감지 정보를 적절히 융합하여 졸음운전을 판단하여야 한다.

2018 ict _ 최우수상 (80)

설계 과정
두 가지의 정보가 생길 때 마다 변수의 값을 더한다.
주기적으로 변수를 확인하여 일정 수치를 넘으면 졸음운전이라고 판단한다. 주기적으로 변수를 확인할 때 일정 수치를 깎아서 시간이 지나면 경고를 멈추게 한다.

2018 ict _ 최우수상 (81)

구현
차선 이탈 감지 정보, 눈 감음 정보가 생길 때 count_계열 변수를 증가시킨다.

2018 ict _ 최우수상 (82)
일정 시간마다 count_total을 체크하여 5가 넘을 시 경고를 준다. 그 후 일정 수치만큼 count_total을 감소시킨다.

2018 ict _ 최우수상 (83)

6.2.4. 안전운전 수치 그래프 만들기
개요
사용자가 어플리케이션을 사용하여 운전을 할 때 감지되는 졸음운전 횟수를 저장하여 이를 바탕으로 운전자의 안전운전 수치 기록 그래프를 만든다.
이를 통하여 사용자는 자신의 운전습관을 간접적으로 알 수 있으며 보다 안전한 운전을 할 수 있다.

설계과정
졸음이 감지될 때마다 그 횟수를 파일에 저장, 횟수는 일별로 저장, 저장된 내용을 사용하여 그래프를 만든다.

구현
해당 일자의 졸음운전 감지 횟수를 텍스트 파일에 “년 월 일 – 감지횟수”로 저장한다.

2018 ict _ 최우수상 (84)
파일에 기록된 정보를 불러와서 label : 날짜, entry : 감지 횟수를 저장한다.

2018 ict _ 최우수상 (85)
lineDataSet에 정보를 저장한 뒤에 lineChart객체(그래프 객체)의 설정값을 변경한 뒤에 그래프를 그려준다.

2018 ict _ 최우수상 (86)

결과
사용자의 안전운전 수치 그래프가 만들어졌다.
그래프의 수치는 사용자의 졸음운전 횟수이다.
졸음운전 횟수가 많을수록 안전하지 않은 운전을 했기에 그래프가 낮아진다.

2018 ict _ 최우수상 (87)

7. 개발 환경

2018 ict _ 최우수상 (88)
· 차선 검출 : Visual studio 2010 c++, OpenCV, Raspberry Pi
· 운전자 얼굴 검출 : Android Studio
· 네트워크 환경 : Firebase
· 사용시스템 및 S/W크기(Mbyte)

2018 ict _ 최우수상 (89)

8. 단계별 제작 과정

2018 ict _ 최우수상 (90)

9. 참고문헌
· 눈 깜빡임 관련 알고리즘
· 안드로이드 눈깜빡임 감지
· 옵티컬플로우 예제
· 옵티컬플로우 함수 설명
· opencv에서 옵티컬플로우
· 옵티컬플로우 사용예제
· canny edge 기초설명
· 자바에서 canny edge 사용
· 허프변환 기초설명
· 허프변환 사용예제
· 허프변환 사용예제
· 차선 이탈 시스템 이론
· 설계/구현 과정
· 환경 구축
· 언어간 함수변환
· 구글 firebase
· 파이썬 채팅 앱 to firebase
· 안드로이드 UDP이용 메시지 전송예제 
· FCM으로 메시지 전송 구현
· 안드로이드 FCM 샘플
· FireBase DataBase 기초
· 스케치업 위키백과
· Creator K 사용자 가이드
· 3ds 맥스 위키백과

 

 

 

 

Leave A Comment

*