>  기사  >  기술 주변기기  >  AI 가상 제스처로 비행기 전투를 즐겨보세요

AI 가상 제스처로 비행기 전투를 즐겨보세요

王林
王林앞으로
2023-05-17 11:34:061294검색

안녕하세요 여러분.

이 작은 프로젝트를 세분화하여 단계별로 구현해 보겠습니다. 기사 마지막 부분에서는 프로젝트의 전체 소스 코드를 얻을 수 있습니다.

1. 항공기 전쟁 프로그램 준비

Github에서 Python 버전의 항공기 전쟁 프로그램을 찾아 Pygame을 설치하고 실행하세요.

AI 가상 제스처로 비행기 전투를 즐겨보세요

게임 조작은 간단합니다. 오른쪽 상단에 게임 일시정지/시작 버튼이 있는데, 마우스 클릭으로 조작할 수 있습니다.

키보드의 A, D, W, S 키는 각각 왼쪽, 오른쪽, 위, 아래에 해당하는 기체의 이동 방향을 제어하는 ​​데 사용됩니다.

그래서 우리 AI 프로그램은 두 가지 핵심 기능을 완성해야 합니다. 첫째, 제스처를 인식하고, 둘째, 제스처를 마우스 및 키보드 작동으로 변환하여 게임을 제어해야 합니다.

2. 제스처 인식

여기에서는 opencv를 사용하여 카메라에서 비디오 스트림을 읽습니다.

비디오 스트림의 각 프레임을 미디어파이프의 손바닥 감지 모델로 보내 손바닥의 21개 핵심 지점을 식별합니다.

AI 가상 제스처로 비행기 전투를 즐겨보세요

저희 프로젝트에서는 좌우 8번지와 12번지인 검지와 중지만 사용합니다.

핵심 코드는 다음과 같습니다.

ret, frame = cap.read()
results = hands.process(frame[:, :, ::-1])
if results.multi_hand_landmarks:
# 遍历每个手掌
for hand_landmarks in results.multi_hand_landmarks:
finger_axis_8 = hand_landmarks.landmark[8]
finger_axis_12 = hand_landmarks.landmark[12]

frame​은 비디오 스트림의 각 프레임이고 손은 손바닥 감지 모델입니다.

파싱된 Finger_axis_8 및 Finger_axis_12 개체는 각각 검지와 중지의 x 및 y 좌표를 저장합니다.

3. 게임을 일시 정지하는 제스처 제어

검지와 중지의 좌표 사이의 거리를 계산하여 특정 임계값보다 큰 경우 마우스를 움직여 게임 일시 정지 버튼을 클릭합니다.

AI 가상 제스처로 비행기 전투를 즐겨보세요

게임이 일시 정지되었습니다

검지와 중지의 좌표 사이의 거리가 일정 임계치보다 작다면 마우스를 움직여 게임 시작 버튼을 클릭하세요

AI 가상 제스처로 비행기 전투를 즐겨보세요

게임이 시작됩니다

거리 계산은 매우 간단합니다. 여기에는 코드가 게시되어 있지 않습니다. 이제 Python이 마우스를 제어하는 ​​데 집중하겠습니다.

저는 PyMouse와 PyKeyboard라는 두 가지 클래스를 제공하는 PyUserInput 라이브러리를 사용하여 마우스와 키보드를 각각 제어합니다.

Python 프로그램을 사용하여 게임의 일시 중지 및 시작을 제어하려면 마우스를 버튼으로 이동하고 클릭 작업을 수행하기만 하면 됩니다.

# 定义鼠标对象
self.mouse = PyMouse()

def pause_or_start_game(self, dist):
"""
判断是否需要暂停(开始)游戏
:param dist:
:return:
"""
if (not self.is_pause and dist > 80) or (self.is_pause and dist < 80):
self.mouse.move(915, 125)
self.mouse.click(915, 125)

self.is_pause = not self.is_pause

pause_or_start_game​ 함수의 매개변수 dist는 검지와 중지 사이의 거리입니다.

일시정지/시작 버튼의 좌표는 (915, 125) 입니다. 각 컴퓨터의 좌표는 실제 상황에 따라 다시 계산해야 합니다.

계산 아이디어는 매우 간단합니다. 게임 테두리 크기는 (480, 700)​입니다. 화면의 크기만 알면 게임이 시작됩니다. 대략 추정됩니다. PyMouse의 이동 함수를 호출한 후 확인하고 미세 조정하세요.

PyMouse의 move 기능은 마우스 위치를 이동하는 데 사용되며, click 기능은 마우스 클릭 작업을 수행하는 데 사용됩니다.

4. 항공기 움직임의 제스처 제어

여기에서는 인접한 두 프레임에서 검지 손가락의 x 및 y 좌표의 이동 방향과 거리를 계산해야 합니다. 이는 키보드 A, D, W, S 중 어느 키를 누르는지 결정합니다.

마찬가지로 이동 방향과 거리는 매우 간단하므로 여기서는 키보드 키를 제어하는 ​​PyKeyboard 모듈에 중점을 두지 않습니다.

self.key_board = PyKeyboard()
# 按下按键
self.key_board.press_key(key)
# 停留一段时间
time.sleep(press_dwell)
# 释放按键
self.key_board.release_key(key)

press_key와 release_key 함수 사이에는 키의 지속 시간을 제어하기 위해 time.sleep(press_dwell)이 호출됩니다. 키를 오랫동안 누르고 있으면 기체가 이동하는 거리가 길어집니다. 키를 짧게 누르면 기체가 이동하는 거리가 짧아집니다.

그래서 여기서 어려운 점은 검지의 이동 거리를 키를 누르는 시간에 매핑하는 방법입니다.

다음 코드를 사용하여 측정했습니다

for i in range(n):
kb.press_key('A')
time.sleep(0.05)
kb.release_key('A')

고정 키 지속 시간은 0.05초이며 테스트 항공기는 중앙에서 가장 왼쪽으로 이동하므로 가장 작은 n이 필요합니다.

AI 가상 제스처로 비행기 전투를 즐겨보세요

항공기는 중앙에서 가장 왼쪽으로 이동하며 이동 거리는 240입니다. 따라서 240 / (n * 0.05)은 초당 항공기의 이동 거리입니다.

n=7​로 측정했으므로 항공기가 초당 이동하는 거리는 685.7142857입니다.

검지 손가락의 이동 거리를 계산하고 685.7142857로 나누면 키보드의 키 지속 시간을 얻을 수 있습니다.

항공기 움직임의 제스처 제어를 위한 전체 코드는 다음과 같습니다.

def press_key_board(self, direction, move_dist):
"""
将手指移动距离,换算为按键间隔,并执行按键操作
:param direction:移动方向
:param move_dist:移动距离
:return:
"""
dist_per_sec = 685.7142857
if direction == 'x':
key = 'A' if move_dist < 0 else 'D'
elif direction == 'y':
key = 'W' if move_dist < 0 else 'S'
else:
return

press_dwell = math.fabs(move_dist / dist_per_sec)
self.key_board.press_key(key)
time.sleep(press_dwell)
self.key_board.release_key(key)

프로젝트의 핵심 부분이 설명되었으며 전체 코드가 정리되어 있습니다. 필요한 경우 댓글 영역에 메시지를 남겨주세요.

코드를 획득한 후 먼저 실행 중인 steps.txt를 살펴보세요.

이 기사가 도움이 되었다면 "읽기"를 클릭하여 앞으로도 훌륭한 Python+AI 프로젝트를 계속 공유하겠습니다.

위 내용은 AI 가상 제스처로 비행기 전투를 즐겨보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제