졸음 운전 경보기

김영한·2020년 10월 31일
0

공모전

목록 보기
1/1
post-thumbnail

📕 졸음운전 경보기

📢 한이음에서 개최한 공모전 프로젝트이다.
📚 코드는 Github에서 참고!

📖 작품 소개

운전자의 눈을 중점으로 해서 졸음을 인식하고 다양한 아두이노 기기를 이용해 졸음 중임을 인식한다. 이로써 운전자의 졸음 운전을 방지할 수 있는 프로젝트이다.

📖 사용한 기술

Opencv, Dlib, Python, Arduino

📖 작품 구성도

웹 카메라를 통해 눈 깜빡임과 차선을 인식하고 해당 정보를 라즈베리파이에서 입력받는다.
라즈베리파이에서 가지고 있는 입력 값과 Co2 센서의 수치에 따라 졸음인지 아닌지를 인식하고 졸음이라고 판단되면 졸음을 깨워주는 장치들이 작동한다.

📖 S/W

  1. 눈 깜빡임 인식
    • Opencv를 이용해 운전자의 눈을 실시간으로 감지하고, 눈의 가로와 세로의 비율을 통해 눈이 감겨있는지 확인한다.
      rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
      shape = predictor(gray, rect)
      shape = face_utils.shape_to_np(shape)
      leftEye = shape[lStart:lEnd]
      rightEye = shape[rStart:rEnd]
      leftEAR = eye_aspect_ratio(leftEye)
      rightEAR = eye_aspect_ratio(rightEye)
      ear = (leftEAR + rightEAR) / 2.0
    • 운전자의 눈 폭이 사전 정의된 임계값 미만일 시에 졸음을 감지한다.
      if ear < EYE_AR_THRESH:
              COUNTER += 1
      	if COUNTER >= EYE_AR_CONSEC_FRAMES:
      		if not ALARM_ON:
                     		ALARM_ON = True
                     		if args["alarm"] > 0:
                         		th.buzzer.blink(0.1, 0.1, 10, background=True)
                 	cv2.putText(frame, "DROWSINESS ALERT!", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
       else:
      	COUNTER = 0
       	ALARM_ON = False
  2. 차선 인식
    • 차량이 깜빡이를 켜지않았다고 가정할 때 차선을 이탈했을 시 감지한다.
      for (x, y, w, h) in cars:
      	cv2.rectangle(temp, (x, y), (x + w, y + h), (0, 255, 255), 2)
      	center = offset(left_fit_line[0] , 180 , right_fit_line[0])
       	if abs(center) > 1.5:
         		center_x = int(640 / 2.0)
         		center_y = int(360 / 2.0)
         		thickness = 2
         		location = (center_x - 200, center_y - 100)
         		font = cv2.FONT_HERSHEY_SIMPLEX;
        		fontScale = 3.5
          		cv2.putText(temp, 'Warning', location, font, fontScale, (0, 0, 255), thickness)
             		color = [0, 0, 255]
      테스트 영상에서는 웹캠 대신 동영상을 이용해 인식했다.

📖 H/W

  1. Co2 센서
    Co2 농도가 높아지면 운전자의 졸음을 야기할 수 있다. 이에 자동으로 창문을 개방, 환기하는 역할이다.
    • 주기적으로 읽기
      1초당 한 번씩 이산화탄소 센서에 값을 가져와서 읽는다.
    • 농도 정보
      ~700 장시간 있어도 건강에 문제가 없는 실내 레벨
      ~1000 건강 피해는 없지만 불쾌감을 느끼는 사람이 있는 레벨
      ~2000 졸림을 느끼는 등 컨디션 변화가 나오는 레벨
      int hodnota = co2Sensor.read();
      if (hodnota > 1000) {
      	Serial.println("CO2 > 1000ppm, Moter On!!!");
      	myStepper.step(stepsPerRevolution);
      	delay(500);
      }
  2. 경보음과 비상등
    운전자가 자신의 졸음상태를 의식하지 못하는 경우에 사용한다. 졸음이 감지되면 경보음으로 운전자에게 인식, 주변 차량에게 비상등으로 특이사항을 알리는 역할이다.
    • 비상등 구현 방법
      LED를 깜빡거리는 방법으로 표현
    • 경보음 구현 방법
      피에조 부저를 이용하여 표현
      if(Serial.available()){
      	val=Serial.parseInt();
      	analogWrite(led,255);
      	delay(2000);
      }
      else{
      	analogWrite(led,0);
      }

📖 시연 결과

📌시연 영상 : 졸음 운전 방지 프로그램

0개의 댓글