Helo, semua.
Mari pecahkan projek kecil ini dan bawa anda melalui langkah demi langkah pelaksanaan Di akhir artikel, kami akan mendapat kod sumber lengkap projek.
Cari versi Python program perang pesawat di Github, pasang Pygame dan jalankan.
Operasi permainan adalah mudah, penjuru kanan sebelah atas ialah butang jeda/mula permainan, klik dengan tetikus untuk beroperasi.
Kekunci A, D, W dan S pada papan kekunci digunakan untuk mengawal arah pergerakan pesawat, masing-masing sepadan dengan kiri, kanan, atas dan bawah.
Jadi program AI kami mesti melengkapkan dua fungsi teras Pertama, mengenali gerak isyarat; kedua, menukar gerak isyarat kepada operasi tetikus dan papan kekunci untuk mengawal permainan.
Di sini, kami menggunakan opencv untuk membaca strim video daripada kamera.
Hantar setiap bingkai dalam strim video ke model pengesanan tapak tangan dalam paip media untuk mengenal pasti 21 titik utama tapak tangan.
Dalam projek kami, hanya jari telunjuk dan jari tengah digunakan iaitu titik ke-8 dan ke-12 di kiri dan kanan.
Kod teras adalah seperti berikut:
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]
bingkai ialah setiap bingkai dalam strim video, dan tangan ialah model pengesanan tapak tangan.
Objek finger_axis_8 dan finger_axis_12 yang dihuraikan masing-masing menyimpan koordinat x dan y jari telunjuk dan jari tengah.
Kira jarak antara koordinat jari telunjuk dan jari tengah Jika lebih besar daripada ambang tertentu, gerakkan tetikus dan klik jeda butang permainan.
Permainan dijeda
Jika jarak antara koordinat jari telunjuk dan jari tengah kurang daripada ambang tertentu, gerakkan tetikus dan klik butang mulakan permainan
Permainan bermula
Pengiraan jarak sangat mudah Saya tidak akan menyiarkan kod di sini, tetapi fokus pada Python yang mengawalnya tetikus.
Saya menggunakan perpustakaan PyUserInput, yang menyediakan dua kelas, PyMouse dan PyKeyboard, untuk mengawal tetikus dan papan kekunci masing-masing.
Apabila kita ingin menggunakan program Python untuk mengawal jeda dan permulaan permainan, kita hanya perlu menggerakkan tetikus ke butang dan melakukan operasi klik. Parameter dist fungsi
# 定义鼠标对象 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 ialah jarak antara jari telunjuk dan jari tengah.
Koordinat butang jeda/mula adalah (915, 125). Koordinat setiap komputer adalah berbeza Anda perlu mengira semula mengikut situasi sebenar anda.
Idea pengiraan adalah sangat mudah Saiz sempadan permainan ialah (480, 700) butang boleh dianggarkan secara kasar. Selepas memanggil fungsi pindah PyMouse, semak dan perhalusinya.
Fungsi PyMouse's move digunakan untuk menggerakkan kedudukan tetikus, dan fungsi klik digunakan untuk melaksanakan operasi klik tetikus.
Di sini, anda perlu mengira arah pergerakan dan jarak koordinat x dan y jari telunjuk dalam dua bingkai bersebelahan. Ini menentukan papan kekunci A, D, W dan S yang mana ditekan.
Begitu juga, arah dan jarak pergerakan adalah sangat mudah dan tidak akan dibincangkan di sini Fokusnya adalah pada kawalan kekunci papan kekunci oleh modul PyKeyboard.
self.key_board = PyKeyboard() # 按下按键 self.key_board.press_key(key) # 停留一段时间 time.sleep(press_dwell) # 释放按键 self.key_board.release_key(key)
Antara fungsi press_key dan release_key, time.sleep(press_dwell) dipanggil untuk mengawal tempoh kekunci Jika kekunci ditekan untuk masa yang lama, jarak pergerakan pesawat adalah panjang sebaliknya, jika kekunci ditekan untuk masa yang singkat, jarak pesawat bergerak adalah pendek.
Jadi, kesukaran di sini ialah bagaimana untuk memetakan jarak pergerakan jari telunjuk kepada tempoh menekan kekunci.
Saya menggunakan kod berikut untuk mengukurnya
for i in range(n): kb.press_key('A') time.sleep(0.05) kb.release_key('A')
Tempoh kunci tetap ialah 0.05 saat, dan pesawat ujian bergerak dari tengah ke paling kiri, minimum n yang diperlukan.
Pesawat bergerak dari tengah ke kiri jauh, dan jarak pergerakannya ialah 240. Oleh itu, 240 / (n * 0.05) ialah jarak pergerakan pesawat setiap kedua.
Saya mengukur n=7, oleh itu, jarak pesawat bergerak sesaat ialah 685.7142857.
Selagi anda mengira jarak pergerakan jari telunjuk anda dan membahagikannya dengan 685.7142857, anda boleh mendapatkan tempoh kekunci papan kekunci.
Kod lengkap untuk kawalan gerak isyarat pergerakan pesawat ialah:
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)
Bahagian teras projek telah diterangkan dan kod lengkap telah diselesaikan Jika anda memerlukannya, tinggalkan a mesej di ruangan komen.
Selepas mendapatkan kod, lihat dahulu pada steps.txt yang sedang dijalankan.
Jika anda rasa artikel ini berguna untuk anda, sila klik "Baca" untuk menggalakkan saya, saya akan terus berkongsi projek Python+AI yang sangat baik pada masa hadapan.
Atas ialah kandungan terperinci Mainkan pertempuran kapal terbang dengan gerak isyarat maya AI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!