Skip to content

beautifulchoi/Red_light_green_light

Repository files navigation

프로젝트 개요

1. 주제 선정

  • 무궁화 꽃이 피었습니다
  • NETFLEX의 오징어 게임에서 로봇이 사람의 얼굴을 인식하며 ‘무궁화꽃이 피었습니다‘ 게임을 하는 것에서 아이디어 착안
  • 게임 앱 제작을 통해 실습 시간 내 배운 모든 GPIO 장치 활용이 용이하며, 스레드와 핸들 통신을 활용하는데 적합
  • 얼굴 검출 및 필터링을 통해 OpenCV 및 OpenCL 활용 가능

2. 프로젝트 설명

image

  • 게임시작 버튼 및 GPIO 센터 버튼을 누르면 게임이 진행되며, 움직일 수 있는 시간과 멈춰야 하는 시간이 매 턴마다 랜덤하게 주어진다.
  • 게임 진행은 후면카메라를 이용하다.
  • 움직일 수 있는 시간에는 보드에 다가갈 수 있으나, 멈춰야 하는 시간에는 보드가 움직임을 얼굴의 좌표로 감지하여 이전 얼굴의 위치와 비교하여 일정 범위를 넘어가면 게임이 종료되며 실패 메시지를 띄운다.
  • 각각의 이벤트마다 LED가 깜박이며, 정지 시간에는 타이머가 동작하여 세그먼트에 표시된다.
  • 보드에 잡히는 화면의 2/5가 얼굴 크기로 인식되면 게임은 종료되며 성공 메시지를 띄운다.

3. 프로젝트 설계 과정

image

  • 1주차: xml 작성(initial, main) 및 제어 장치(LED, segment) 코드 제작(객체화 및 동작 테스트), 카메라 프리뷰
  • 2주차: 얼굴인식 api 삽입, 게임 루프 작성
  • 3주차: 게임 루프 작성 완료 및 제어 api 게임 루프에 삽입, 얼굴 대기 이벤트 코드 작성, GPIO 버튼 제어 코드 작성 및 삽입, 스레드 핸들러 작성 및 UI 컨트롤, Ending 제작
  • 3주차 추가개방: 카메라 사진 캡처 및 캡처 사진 엔딩 액티비티로 전송, OpenCV 및 OpenCL 활용한 캡쳐 사진 변경

앱 동작

1. 게임 시작 전 초기 화면

image

  • 프로젝트 진행 중 프로젝트 빌드를 다시 해야 하는 이슈가 발생하여 “MP_final”프로젝트는 삭제 후, “test” 프로젝트에 다시 빌드하였습니다.
  • 버튼을 누르면 메인 액티비티로 이동

2. 얼굴 인식(게임 시작 전)

image

  • 얼굴을 화면에 놓기 전까지 얼굴 인식 리스너(쓰레드로 정의)가 동작하며 얼굴을 파악.
  • 얼굴을 인식하게 되면 화면에 초록색 박스로 표시되며, 인식하자마자 게임이 바로 시작되지 않고 GPIO 센터 버튼을 누르면 시작한다.
  • 버튼 클릭 시 현재 위치의 사진을 비트맵으로 저장한다.

3. 게임 진행

게임 진행 - 움직 시간

image

  • 움직여서 보드에 다가갈 수 있는 상태. 2~6초 이내 랜덤 시간동안 움직일 수 있으며, 이벤트가 시작될 때 LED가 0.5초동안 점등되고 꺼진다.
  • 인식되는 얼굴의 크기가 일정 크기 이상 되면 LED가 3번 깜박거리며 성공 액티비티로 넘어간다.

게임 진행 – 정지 시간

image

  • 정지해야 하는 상태. 2~6초 이내 랜덤 시간동안 멈춰서 정지해야 하며, 이벤트가 시작될 때 LED가 0.5초동안 점등되고 꺼진다.
  • 움직임 판정은 얼굴의 중앙 좌표의 변화를 비교하게 되는데, 이전 얼굴객체의 바운딩 박스 크기의 10% 범위 이상을 현재 얼굴 중앙 좌표의 위치가 벗어나게 되면 게임은 실패 액티비티로 넘어간다. 넘어가기 전에 LED가 순서대로 3개 켜진다.

4. 게임 종료

성공

image

  • 게임 실패 시 나타나는 화면. 시작할 때 찍었던 사진을 실패 액티비티로 넘겨준 후, openCL을 이용한 grayscale을 적용하여 캡쳐 사진을 회색조로 바꾼 후 실패 메시지와 함께 화면에 출력한다.

실패

image

  • 게임 성공 시 나타나는 화면. 시작할 때 찍었던 사진을 실패 액티비티로 넘겨준 후, openCV을 이용하여 canny 알고리즘을 적용하여 사진의 외곽선을 부각시킨다. 실패 메시지와 함께 해당 변경한 사진을 화면에 출력한다.

게임 루프

  • 게임 루프를 돌릴 스레드 클래스 내에 움직일 수 있는 상황의 이벤트인 whileMove() 함수, 정지 상황의 이벤트인 whileStop() 함수를 정의합니다. UI를 변경하기 위해 해당 스레드와 통신할 핸들러 클래스를 따로 정의하여 이벤트가 바뀔 때마다 텍스트가 바뀌도록 신호를 보내줍니다. image

About

applied mp class final project, UOS, ECE

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages