OpenCV ile nesne algılama hakkında

Değerli yorumunuz için öncelikle teşekkürler hocam.
Öncelikle mavi hapla devam edicem hocam.
Sebebi de oyun güvenlik korumasından dolayı dışarıdan bağlantılara izin vermiyor.
Yapılabilir mi evet yapılabilir.
Ama yıllarını vermiş insanlar yapabiliyor bunu.
Baya zor ve uğraşlı bir koruması var.
O yüzden ben oyun farketmeden bir makro gibi kullanmaya devam etmek zorundayım.
Dediklerinizin aynısını bende düşünüyorum şu şekilde olacak diye kafamdan ama dil bilmediğim için bunu kodlara dökmekte zorlanıyorum.
Bu konuyu açmamın sebebi de bu.
Zorlanmam ve yardım istemem.
Google da bu kodlar çıkıyor.
Resim bulma,koordinatını belirleme,o koordinata click yapma vs.
Fakat ben bu kodları birleştirmekte sıkıntı yaşıyorum.
Googleye yazınca hepsini tek tek kodlar bulunabiliyor ama birleştirmeye gelince burada dil bilgisi devreye giriyor.
Bende de dil bilgisi amatörün daha altında olduğu için zorlanıyorum hocam. Şimdiden teşekkürler.

Değerli yorumunuz için öncelikle size de teşekkürler hocam.
Dediğiniz gibi bunu basit bir şekilde pyAutogui modülü ile yapılabiliyor.
Fakat ben kodları birleştiremiyorum.
Kodları googleden buluyorum birleştirmeye gelince beceremiyorum.
Bot kontrol ekranında 6 adet resim var.
2 adet resim birbirine benziyor fakat birinin üstünde mavi çizgi daha çok.
Bot kontrolün bizden istediği ise mavi çizgisi fazla olana tıklamak.
Ben çizgi için uğraşmıyorum bile.
İlk tıkladığında tutmasa bile 2 veya 3. tıklamasında illaki tutturur.

“Bana kalırsa 30 dakikada bir oyunu baştan başlatıp oyunu oynatan bot yazman daha kolay olacak”
Bu dediğinizi nasıl yapacağımı gerçekten bilmiyorum. Bunu yapsam tabi daha iyi ama dediğim gibi dil bilgim amatörün daha altı :slight_smile:

Naçizane fikrimi belirtmek istiyorum. Bunu söylemek bana düşmez çünkü bu işte gerçekten senior olan adamlar var bu forumda.

Neden bot yapmadan önce dili öğrenme çabası içerisine girmiyorsunuz ?
Neden koşmak ?
Neden emeklememek ?
Sitenizdeki projeleri de inceledim. Onlarda mı böyle sorunlar sonucunda çıkmış projeler ?
Onları da mı birileri tarafından yazılıp hazır kullanılan kodlar(kod) ?

Bu forumun bana öğrettiği yegane şey; şahıs olarak birine sormadan önce herkesin görüşünü almak(araştırmak) ve bu dili "tamam ya kendimi ifade edebiliyorum " diyebilene kadar öğrenmeme vesile olan insanlarla dolu. Sizce bu insanlar sizin hakkınızda ne düşünüyordur ?

(Hazır konusu açılmışken de hepsine teker teker teşekkür ediyorum :heart:)

2 Beğeni

Hocam Öncelikle kodlar benim değil.
Saygıdeğer ve paylaşımcı bir hocamız yazmış ve github da paylaşmış.
Buradan teşekkürler kendisine.
“Neden bot yapmadan önce dili öğrenme çabası içerisine girmiyorsunuz ?”
Benim bu platforma girerken de ilk duyduğum şey sevdiğin şeyi yap ki sıkılmayasın.
Bende oyunda ki botu hiç yazmadım belki ama içinde birkaç değişiklik yaparak kullanmak bile bi zevk veriyor insana.
Önce botu çalıştırıcam sonra yine öğrenmeye devam edicem.
Koşmak yada emeklememek değil niyetim.
Bu botu çalıştırmaya çalışırken bile bir sürü bilgi öğreniyorum python hakkında.
Hazır kodlarla çalışmakta belki ezbere öğrenmek gibi birşey ama bu az bile olsa birşeyler katıyor insana.
Çok az bir miktar da olsa python fonksiyonlarını öğrenmeye başlıyorsun.
Belki dediğiniz gibi yapmak daha doğru ama o zaman da bu bot çalışmaz ve insanın morali bozulur.
Bende bu yüzden önce botumu çalıştırıcam o zevki tatıcam ama yine farklı konulara da yönelerek, ders videoları izleyerek, bir şekilde pythonın tamamını öğrenip kendim bot yazıcam.
Değerli yorumunuz için de teşekkürler hocam.

2 Beğeni

Eğer temeliniz yoksa hazır kodları inceleyerek ilerlemek çok uzun zaman alıyor. Paylaşmış olduğunuz kod 200 satırdan fazla. Ek olarak içinde arayüz, otomasyon ve görsel işleme vb. kütüphanelerin kullanımını da barındırıyor. “ekranyakala.py” isimli dosyada neler olduğunu bilmiyoruz bile.

Bu şekilde ilerlemek istiyorsanız, bu sizin tercihiniz fakat yerinizde olsam bir kaç gün Python’ın temellerini kurcalar, süreci hızlandırırdım.

Ben de öğrenmeye Python ile yapılan çeşitli 2D oyunların kodunu inceleyerek başlamıştım. “Köşeli parantezler ile yapılan şeyler ne ola ki?” diye sorgularken, Python’da listelerin var olduğunu ancak 4 gün sonra kavrayabilmiştim. Demem o ki, öncesinde biraz hazırlık yaparsanız, çok daha hızlı ve iyi bir şekilde ilerleyebilirsiniz.

2 Beğeni

Hocam değerli yorumunuz için öncellikle teşekkürler.
Evet biraz daha zaman alabilir.
Ama ben bunu iş olarak değil hobi olarak yapıyorum.
Yine botum çalışsın ben diğer bilgisayarımda yine dil bilgisine çalışabilirim.
ekranYakala.py içeriği de yukarıda semtex hocamın paylaştığı win32gui modülü kodları var.

import numpy as np
import win32gui, win32ui, win32con
from threading import Thread, Lock

class ekranYakala:
    stopped = True
    lock = None
    screenshot = None
    w = 0
    h = 0
    hwnd = None
    cropped_x = 0
    cropped_y = 0
    offset_x = 0
    offset_y = 0


    def __init__(self, window_name=None):
        # create a thread lock object
        self.lock = Lock()

        # find the handle for the window we want to capture.
        # if no window name is given, capture the entire screen
        if window_name is None:
            self.hwnd = win32gui.GetDesktopWindow()
        else:
            self.hwnd = win32gui.FindWindow(None, window_name)
            if not self.hwnd:
                raise Exception('Window not found: {}'.format(window_name))

        # get the window size
        window_rect = win32gui.GetWindowRect(self.hwnd)
        self.w = window_rect[2] - window_rect[0]
        self.h = window_rect[3] - window_rect[1]

        # account for the window border and titlebar and cut them off
        # border_pixels = 8
        # titlebar_pixels = 30
        # self.w = self.w - (border_pixels * 2)
        border_pixels = 1
        titlebar_pixels = 10
        self.w = self.w - border_pixels
        self.h = self.h - titlebar_pixels - border_pixels
        self.cropped_x = border_pixels
        self.cropped_y = titlebar_pixels

        # set the cropped coordinates offset so we can translate screenshot
        # images into actual screen positions
        self.offset_x = window_rect[0] + self.cropped_x
        self.offset_y = window_rect[1] + self.cropped_y
    def get_screenshot(self):

        # get the window image data
        wDC = win32gui.GetWindowDC(self.hwnd)
        dcObj = win32ui.CreateDCFromHandle(wDC)
        cDC = dcObj.CreateCompatibleDC()
        dataBitMap = win32ui.CreateBitmap()
        dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
        cDC.SelectObject(dataBitMap)
        cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (self.cropped_x, self.cropped_y), win32con.SRCCOPY)

        # convert the raw data into a format opencv can read
        #dataBitMap.SaveBitmapFile(cDC, 'debug.bmp')
        signedIntsArray = dataBitMap.GetBitmapBits(True)
        img = np.fromstring(signedIntsArray, dtype='uint8')
        img.shape = (self.h, self.w, 4)

        # free resources
        dcObj.DeleteDC()
        cDC.DeleteDC()
        win32gui.ReleaseDC(self.hwnd, wDC)
        win32gui.DeleteObject(dataBitMap.GetHandle())

        # drop the alpha channel, or cv.matchTemplate() will throw an error like:
        #   error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type() 
        #   && _img.dims() <= 2 in function 'cv::matchTemplate'
        img = img[...,:3]

        # make image C_CONTIGUOUS to avoid errors that look like:
        #   File ... in draw_rectangles
        #   TypeError: an integer is required (got type tuple)
        # see the discussion here:
        # https://github.com/opencv/opencv/issues/14866#issuecomment-580207109
        img = np.ascontiguousarray(img)

        return img

    @staticmethod
    def list_windowname():
        def winEnumHandler(hwnd, ctx):  #açık pencere isimlerini listeler
            if win32gui.IsWindowVisible(hwnd):
                print(hex(hwnd), win32gui.GetWindowText(hwnd))

        win32gui.EnumWindows(winEnumHandler, None)
    def get_screen_position(self, pos):
        return (pos[0] + self.offset_x, pos[1] + self.offset_y)

    def start(self):
        self.stopped = False
        t = Thread(target=self.run)
        t.start()
    def stop(self):
        self.stopped = True
    def run(self):
        while not self.stopped:
            screenshot = self.get_screenshot()
            self.lock.acquire()
            self.screenshot = screenshot
            self.lock.release()

1 Beğeni

Biraz başlangıç kodu ekleyeyim.

#import the necessary packages
import numpy as np
import pyautogui
import imutils
import cv2


img_rgb = cv2.imread("c:\\Deneme2\\main.jpeg")
template = cv2.imread("c:\\Deneme2\\find.jpg")

dimensions = img_rgb.shape
height = img_rgb.shape[0]
width =  img_rgb.shape[1]


List = []

w,h = template.shape[0], template.shape[1]

res = cv2.matchTemplate(img_rgb,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.95
loc = np.where( res >= threshold)

for i in zip(*loc[::-1]):
    location = (i[0] + w, i[1] + h)
    x = i[0] + w
    y = i[1] + h
    List.append([i, location])

    cv2.rectangle(img_rgb, i, location, (0,255,0), 3)


cv2.imshow("result",img_rgb)
print(x,y)

pyautogui.moveTo(x,y, 2)
pyautogui.click(button='right')
pyautogui.click(x, y)

cv2.waitKey(10000)

Basitten zora doğru.

Bana gönderdiğin resim

main

Bunu main.jpeg olarak kullandım.

Resmin içinden varsayılan bir resmi seçtim.

find

Bunu da içinden kesip find.jpg olarak kullandım.

Dikkat et uzantıların biri jpg diğeri jpeg neden öyle yaptım bilmiyorum. Ramazanda canım istedi.

Sonra c:\ üzerinde Deneme2 klasörü içinde hepsini çalıştırdım.

Resmin üzerine gidip tıklıyor.

Tabi verilen resim çözünürlüğü düşük olduğundan küçük bir resme tıklıyor.

Tam ekran almak için.

image = pyautogui.screenshot()
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
cv2.imwrite("desktop.png", image)

cv2.imshow("Deneme", image)
cv2.waitKey(0)

Gibi bir kod yapıştırarak tam ekran masa üstü görüntünü alabilirsin. Onun üzerinde keseceğin resmi aramak için kullanırsan. Büyük ihtimalle şöyle olacak.

image

Ve mouse üzerine gidecek.

Resme sağ tıklattım ama bir şey olmasını beklememek lazım.

Buradan özetle.

Tam periyotla tam ekran masa üstü resmi alıp,
seçilmesini istediğin resimleri kesip şablon olarak tutup, ana ekranda atatıp çerçeve içine aldırdım.

Bunun yerine resmi oluşturmayıp, çerçeveye de almadan sadece mouse u yürütüp tıkladığın kodu kullanabilirsin.

Resimle görünmesi sadece paterni yakaladığına dair görsel amaçlı.

Kolay gelsin.

1 Beğeni

Faydalandığım bazı kaynakların linkini de buraya bırakayım. Milletin kodunun üstüne çökmüş olmayalım.

python - How do I find an image contained within an image? - Stack Overflow

Taking screenshots with OpenCV and Python - PyImageSearch

Mouse Control Functions — PyAutoGUI documentation

Object Detection — OpenCV 2.4.13.7 documentation

En faydalandığımı da en sona ekleyeyim.

OpenCV matchTemplate finds same shapen multiple times - Python - Stack Overflow

2 Beğeni

Çok saolun hocam. Nasil teşekkür etsem azdır. :pray:

1 Beğeni

merhabalar hatanızı çözdünüz mü bende boyle bişey almaktayım import keyboard, threading, os, webbrowser, ctypes

Ortada bir kod var mı? Bir de hata mesajının ekran resmi falan?

yukarıda paylaştım @semtex

Modüller yüklü değilse kullanamazsın.

pip ile modülleri yüklemeyi biliyor musun?

Yada Pycharm ile modül yüklemeyi?

Pycharm Kütüphane Nasıl Eklenir? - TeknoDestek

Bu şekilde olmayan kütüphaneleri eklemekle başlayabilirsin.

teşekkürler ben buna bi ugrasayım <3
@semtex

modüller yüklenmeyince bulunamadı hatası vermiş. Üzerine tıkla orada yükleyim der. Yüklersin ilgili modülü.

Takılırsan haber ver bakalım ne yapabiliriz.

ben pip ve eksik modülleri pycharm yardımı ile indirdim ama yine aynı hata müsaitseniz discorddan yardım alabilirmiyim sizden dc: muhamed799#4071 @semtex

image
kütüphanede bunlar var @semtex

ve çalıştı suan kendi kendine :smiley: eline saglıkn dostum simdi oyun içi çalıstırmakta :smiley: @semtex

1 Beğeni