본문 바로가기

웹 캠을 이용한 가위바위보 게임

(1) Hand detection

 처음에 했던 방법은 손가락 끝을 인식해 개수를 세서 가위바위보를 인식하는 것이었는데 다양한 각도에서 손가락 끝이 인식이 잘 안됐습니다. 그래서 자료를 찾다보니 mediapipe와 빵형의 개발도상국 유튜브 (관련 github link)에 손동작을 통해 숫자와 다양한 제스쳐를 표현할 수 있도록 구현해 놓은 자료들이 있었고 이를 일부 수정해 가위바위보를 나타내도록 만들었습니다.

 

 

 

  각각의 제스쳐에 해당하는 손가락 각도들이 저장되어 있는 csv파일을 통해 해당 각도와 해당 제스쳐 라벨의 데이터를 모아 KNN으로 학습시켰습니다.

 

 빨간점들을 조인트라고 하는데 이것들의 x,y,z 좌표를 저장한 후 각 조인트를 빼면 관절에 대한 벡터가 계산됩니다. 그 후 벡터를 노말라이즈 해 유닛벡터로 만든 후 아크코사인에 대입해 각도를 구합니다. 아크코사인을 사용하는 이유는 벡터 ab를 내적하면 a의 크기 곱하기 b의 크기 곱하기 두 벡터가 이루는 각의 cos인 값인데 위에서 노말라이즈를 통해 크기를 1로 했기 때문에 두 벡터의 내적 값은 두 벡터가 이루는 각의 cos값이 돼서 이것을 코사인 역함수인 아크코사인에 대입하면 두 벡터가 이루는 각이 나오게 됩니다.

 

 화살표로 나타낸 것처럼 벡터가 총 20개가 나오고 01벡터와 12벡터사이의 각도, 12벡터와 23벡터 사이의 각도, 23벡터와 34벡터 사이의 각도 등 이처럼 손가락마다 3개씩 각도가 나오기 때문에 총 15개의 각도가 계산됩니다.

 

 

 이 방법은 다양한 각도에서도 가위, 바위, 보를 인식할 수 있었고 KNN으로 학습시켰기 때문에 손동작에 해당하는 라벨이 빠르게 인식되었습니다.