Daha önceki yazımda Python ve yapay zeka ile nesne algılama uygulaması yapmıştık.
Şimdi bu uygulamayı bir tık ileri görüterek Yapay Zeka’ya Duckhunt (atariden bildiğiniz ördek avlama) oyununu oynatacağız.
![](http://wwphp.com/wp-content/uploads/2019/11/wwPhp-Ai-Duckhunt-game-play.gif)
Bunun ile ilgili örnek oynatım videosu ve açıklamalı kodları aşağıda bulabilirsiniz.
Örnek Yapay Zeka Duckhunt oynama videosu :
Python ile Yapay Zeka’ya Duckhunt oynatımı ile ilgili kodumuz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import cv2 import numpy as np from PIL import ImageGrab import pyautogui import time while(True): try: #Anlik olarak ekran goruntumuzu sagdan 40 pixel iceride ve ustten 40 pixel # asagida olmak uzere 600x600 boyutunda aliyoruz. EkranGoruntusu = np.array(ImageGrab.grab(bbox=(40,40,640,640))); #Yakalancak Nesne olarak ordek gorselimizi belirtiyoruz. DuckDataSet = cv2.imread('duck.png'); # SIFT Dedektorumuzu Baslatiyoruz sift = cv2.xfeatures2d.SIFT_create(); # SIFT uzerinde Ekrangroruntumuz ve ordek resmimizdeki karsilastirilabilecek kilit noktalari buluyoruz. kp1, des1 = sift.detectAndCompute(EkranGoruntusu,None); kp2, des2 = sift.detectAndCompute(DuckDataSet,None); # FLANN parametrelerimizi tanimliyoruz. FLANN_INDEX_KDTREE = 1; index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5); search_params = dict(checks=50); flann = cv2.FlannBasedMatcher(index_params,search_params); matches = flann.knnMatch(np.float32(des1),np.float32(des2),k=2); # Iyi olan eslesmeler icin maske olusturuyoruz. matchesMask = [[0,0] for i in range(len(matches))] # Tespit edilen nesneleri vurmak icin degiskenlerimizi olusturuyoruz. Y_Koor = 0; X_Koor = 0; olasilik = 0; for i,(m,n) in enumerate(matches): if m.distance < 0.5*n.distance: matchesMask[i]=[1,0]; point = kp1[m.queryIdx].pt; X_Koor = int(point[0]); # X koordinatindaki noktamiz. Y_Koor = int(point[1]); # Y koordinatindaki noktamiz. olasilik = olasilik + 1; # Her eslesen nokta icin olasiligimizi 1 arttiriyoruz. if(olasilik > 3): # Eger 1 nesne icin 3 adet esleme varsa nesnenin bulundugu koordinata islem uyguluyoruz. pyautogui.click(x=X_Koor, y=Y_Koor); # Nesnenin bulundugu kooardinata mousemizi tiklatiyoruz. olasilik = 0; # Olasiligi sifirliyoruz. draw_params = dict( singlePointColor = (255,0,0), matchesMask = matchesMask, flags = cv2.DrawMatchesFlags_DEFAULT); # KNN eslesmelerimizi ekranda gosteriyoruz. KNNCiz = cv2.drawMatchesKnn(EkranGoruntusu,kp1,DuckDataSet,kp2,matches,None,**draw_params); cv2.imshow('KNN Duck Shot wwphp',KNNCiz); # Klavye uzerinde q tusuna basinca KNN pencerimizin kapatilmasini sagliyoruz. if cv2.waitKey(27) & 0xFF == ord('q'): cv2.destroyAllWindows(); break; except Exception as e: print(e); pass; |
duck.png Resmimiz (dataset) :
![](http://wwphp.com/wp-content/uploads/2019/11/duck.png)