[]

Python - görüntü algılama - script hızlandırma

Merhaba Duyuru!

Hayatta bir takım şeyleri kolaylaştırması için bir python script yazdım :) Sırasıyla;

1)Ekranın küçük bir bölümünün ekran görüntüsünü alıyor
2)Ekran görüntüsünde aradığım RGB değerini bulup koordinatlarını kaydediyor
3)Bulunan koordinatı tıklıyor

Script, sabit nesneler için gayet güzel çalışıyor ancak ben rastgele hareket eden bir şeyi tıklatmaya çalışıyorum. Dolayısıyla script ss alıp tıklayana kadar nesne rastgele bir yere gidiyor ve ekran görüntüsü alındığı anki yeri tıklıyor. Nesnenin nereye hareket edeceğini bilmediğim için x,y değerlerine bir şeyler ekleyip üstünü tıklatamıyorum. Bir çözüm öneriniz var mı? Bu scripti nasıl hızlandırabilirim?

Teşekkürler!

import pyautogui
import keyboard
import time
import win32api, win32con

time.sleep(2)

def click(x,y):
win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)



while 1:
pic = pyautogui.screenshot(region=(265,220,200,200))
width, height = pic.size

for x in range(0,width,5):
for y in range(0,height,5):
r, g, b = pic.getpixel((x,y))

if g in range(90,95):
click(x+265,y+220)
time.sleep(1)
break

 
ilk düşüncem şu oldu:

Hareket eden nesnenin hızına bağlı ama, ss almasıyla tıklaması arasında tıklanmak istenen kare her yöne makismum kaç pixel gidebiliyor? Tıkladığı yanlış noktanın sağ sol alt ve üstündeki noktaları da koordinat olarak verip, diğer 8 yere arka arkaya tıklasa sorun çözülür mü? Boş tık işinizi bozar mı? oralara tıklayana kadar nesnenin eni ve boyuna göre bi sağ bi üst bi sol bi alt noktaları kovalasa mesela? :)
  • wct3 org  (27.03.23 23:36:30) 
gpt'nin önerisi:

Çoklu işlem (multiprocessing) veya çoklu iş parçacığı (multithreading) kullanarak, eş zamanlı olarak ekran görüntüsü alma ve tıklama işlemlerini gerçekleştirin. Bu, işlemleri aynı anda gerçekleştirerek hızı artırabilir.

Araştırma aralığını daraltarak, örneğin her 5 piksel yerine her 2 veya 3 pikselde bir arama yaparak daha hassas ve hızlı taramalar yapın. Bu, doğru konumu daha hızlı bulmanızı sağlar.

Gereksiz işlemleri azaltarak hızı artırabilirsiniz. Örneğin, tarama işlemi sırasında tıklama işlemi gerçekleştirilirse, tarama işlemine devam etmek yerine döngüyü durdurun.

bu da kod optimizasyonu önerisi:

import pyautogui
import time
import win32api, win32con
from threading import Thread, Event

def click(x, y):
win32api.SetCursorPos((x, y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)

def find_and_click(stop_event):
while not stop_event.is_set():
pic = pyautogui.screenshot(region=(265, 220, 200, 200))
width, height = pic.size

found = False

for x in range(0, width, 2):
if found:
break
for y in range(0, height, 2):
r, g, b = pic.getpixel((x, y))

if g in range(90, 95):
click(x + 265, y + 220)
found = True
break

if __name__ == "__main__":
time.sleep(2)
stop_event = Event()
find_and_click_thread = Thread(target=find_and_click, args=(stop_event,))
find_and_click_thread.start()

try:
while True:
time.sleep(1)
except KeyboardInterrupt:
stop_event.set()
find_and_click_thread.join()
  • wct3 org  (27.03.23 23:49:47) 
@wtc3 org

Aslında hızı sabit ama kaç pikselle ilerlediğini bilmiyorum maalesef. Bir şekilde piksel cinsinden hızını bulsam bile her hatalı tıklamamda sahip olduğum süre azalıyor :) Hatalı tıkın cezası var maalesef :(

Farklı çözüm önerilerine de açığım
  • E.  (27.03.23 23:51:08) 
pyautogui kütüphanesinin "locate" diye bir fonksiyonu var. Bi ona bakın isterseniz.


  • plutongezegendegilmi  (28.03.23 00:33:24) 
100½ emin değilim ancak nesne doğrusal ilerliyorsa tek ekran görüntüsü almak yerine sabit aralıklarla çok sayıda ekran görüntüsü alıp bunlardaki nesneyi tespit ettikten sonra yönünü ve hızını belirleyip kesin bir şekilde bir sonraki anda nerede olacağını hesaplayabilirsiniz. Nesne doğrusal hareket etmiyorsa da aynı mantık kullanılır ama bu sefer işin içindeki matematik biraz daha karışık olur, zira eğri denklemi kullanmanız gerekir.


  • salihdt  (28.03.23 14:36:53) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.