캠을 이용한 가위바위보 게임
=====================================================================================================================================
영상처리 공부를 하면서 처음으로 만든 공부를 위한 가위바위보 게임.
처음 목적은 손을 정면으로 인식하는것이 아니라 측면에서 인식해서 손가락 갯수를 파악하여 주먹 가위 보 를 판별하려 했었다.
그러나 진행중에 본의 아니게 방향을 전환하여 가위바위보 를 실제로 하듯이 구현하는 것으로 목표를 바꾸었다.
처음에는 디버깅하면서 구현하기 편하도록 인터페이스 신경쓰지않고 딱 딱 보이도록 구현 해 보았다.
아래의 사진이 개발용 프로그램의 모습니다.
알고리즘에 대해 설명을 하자면 가장먼저 캠으로 영상을 받아들인다.
그 영상에서 얼굴영역을 찾고 그 열굴 영역 내부의 Cb Cr 값의 평균을 구한다.
이렇게 구한 평균 Cb Cr 값을 이용해 위아래로 적다한 범위를 늘려서 Skin Color 의 범위를 설정한다.
범위 내의 값을 가진 픽셀은 255로 나머지 픽셀은 0으로 이진화를 하고 모폴로지 연산을 한번 수행해준다.
이때에 얼굴은 평균 피부색값을 찾기위해서만 사용되므로 평균 값을 구한 후에는 그 영역에 사각형을 그려줌으로써
이후 연산에서 얼굴 영역이 나타나지 않도록 가려준다.
이런 과정을 거치면 다음과 같은 영상을 얻을 수 있다.
Skin Color 의 boundary를 좀 더 늘리면 손 모양이 명확하게 나오겠지만 다른 노이즈들도 함께 심해지므로
적당한 범위로 설정 해 준다.
이후 위 영상의 결과를 레이블링 해서 각각의 덩어리로 구분 한 뒤 손 영역의 레이블만을 남겨두고 나머지 레이블된 영상은
모두 0값을 대입해 줌으로써 주변 노이즈를 제거한 손 영역만을 얻어 낼 수 있다.
위와 같은 연산 결과로 얻어낸 손 영역의 영상이다. 손 군데군데 구멍이 뻥뻥 뚫려 있긴 하지만
이정도 결과로도 결과가 잘 나오길래 그냥 뒀다.. 사실 귀찮고,, 어렵다.. ㅎ 초보의 패기..
자 저 손 영역에서 어떤 특징을 뽑아내야 가위바위보를 판단할 수 있을까..
히스토그램을 이용하여 구분 가능할 것 같다는 교수님의 말씀을 듣고 히스토그램을 만들어 보았다.
가위바위보를 판별해야하므로 손영상의 세로방향을 히스토그램의 X 축으로
손영상의 가로방향 255값을 가지는 픽셀의 수를 히스토그램의 Y축 데이터로 사용하여 히스토그램을 그리면
대략 이런 형태로 나오게 된다.
이 히스토그램을 어떻게 이용하느냐... 하는것은 나는 일단 저 영역을 3개로 구분하여서 평균값을 구하였다.
좌측 1/3 영역의 평균 픽셀수. 가운데1/3 영역의 평균 픽셀수, 우측 1/3 영역의 평균 픽셀 수를 구하여서 그 데이터를 이용하기로 했다.
매 프레임마다 얻을수 있는 평균 픽셀의 수이다.
이 세구간의 평균 픽셀 수를 이용하여 각각의 비율과 손 영역 폭과 높이의 비 등의 정보를 이용하여
손의 상태가 주먹인지, 가위인지, 보 인지를 판별하게 된다.
기본적인 알고리즘은 이상과 같고
이것 외에도 얼굴 인식부분에서 뒤에 여러사람이 있을경우를 대비해서 가장 앞의 한사람의 얼굴만 이용하는 것과
오른손잡이 왼손잡이 용으로 구분하여 반대영역에 손이 들어왔을 경우를 미리 차단하였고
점수 카운트 기능과 음성출력 기능을 추가하였다.
이렇게 만들어 본 프로그램이 어느정도 성능을 보여줘서
인터페이스까지 신경을 쓴 릴리즈용 프로그램을 만들었다.
사용자의 모습은 보여야하므로 320 x 240 사이즈의 출력 창을 하나 가지고 그외의 정보 (히스토그램, 얼굴,손 영역) 은 표시하지 않는다
구동부는 실제 가위바위보 게임기와 비슷한 디자인을 가지고 있고, 게임 시작버튼은 동전 투입구 이미지를 덧씌워서
좀더 게임기 스럽게 만들어 보았다.
나중에 좀더 공부하고 나서 다른 방법을 추가해서 인식률을 높이는 작업을 해 봐야겠다.
실제 시연 동영상
'전공관련 > 실습 프로그램' 카테고리의 다른 글
Gender Classification (0) | 2013.06.14 |
---|---|
Canny Edge 구현 (1) | 2013.04.17 |
웹캠을 이용한 가위바위보 게임 (18) | 2013.04.16 |
Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험 (0) | 2013.04.16 |
댓글을 달아 주세요
비밀댓글입니다
소스코드는 제가 부끄러워서 안될거같구요.
개별적으로 연락 주시면 아는 범위내에서는 답변드리도록하겠습니다.
비밀댓글입니다
소스코드는 제가 부끄러워서 안될거같구요.
개별적으로 연락 주시면 아는 범위내에서는 답변드리도록하겠습니다.
안녕하세요 정말 감명받았습니다. 이제 영상처리 공부 시작하는 학생인데 이 작품 관련해서 몇가지 간단하게 여쭤봐도 될까요??ㅎㅎ
궁금하신 부분 있다면 제가 아는선에서 답변 드리겠습니다 ^^
주인장님!
mfc랑 opencv랑 어떻게 연동하셨나요????? 인식은 구현했는데 위에 게임처럼 구성하려고 하는데 잘 안되서요ㅠㅠㅠ
기존에 어떻게 사용중이신지는 모르겠지만 mfc 와 같이 사용하시려면
프로젝트 생성하실때 mfc 프로젝트로 만드시고 기존에 사용하셨던 것처럼 opencv path 설정 해주시면 같이 사용가능합니다.
원하시는 답변이 맞는지 모르겟네요...
비밀댓글입니다
위의 인터페이스는 MFC 기반으로 만든거라 이부분은 대체가 가능할 지 모르겠네요 알고리즘 적인 측면은 문제 없을 것 같습니다.
비밀댓글입니다
비밀댓글입니다
비밀댓글입니다
아니요 그런건 없습니다.
이런 프로그램의 경우 매우 기본적인 방식이라 영상처리 처음 연습하는 학생들이 종종 시도하는 테마이기도 합니다.
비슷한 프로젝트를 하고있는데 많이 얻어갑니다! 한가지 질문이 있는데요 얼굴위에 손이 겹쳐질경우에는 어떤경우로 처리하는게 좋을까요?ㅠ
일단 depth 정보 없이는 얼굴 검출기를 이용하여 얼굴영역안에 들어 올 경우는 예외처리를 넣어주는 방법이 제일 간단할 것 같네요. 아니면 손 인식영역을 명시적으로 표시해줌으로써 그 안에서 인식이 이루어 지도록 하는 것도 방법이 될 것 같습니다.
비밀댓글입니다
아쉽게도 제가 7년전에 연습용으로 만들어봤던 프로그램이라 지금은 데이터를 가지고 있지 않네요.. 이미지 파일들은 모두 웹에서 수집한것이니 비슷한 이미지 찾아보시면 많이 있을거에요..
카테고리
태그목록
달력
LATEST FROM OUR BLOG
BLOG VISITORS
Copyright © 2015 Socialdev. All Rights Reserved.
티스토리툴바