[]
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
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? :)
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()
Ç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
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