Сопоставление шаблонов для подсчета картPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сопоставление шаблонов для подсчета карт

Сообщение Anonymous »

Я действительно ничего не знаю о Python, я только что написал этот код с помощью Chatgpt и моего эффекта iq. Я хочу спросить, как сделать приложение для более быстрого счетчика карт? Я сделал это для игры Пишти. Это работает, засчитывается, но иногда проходит. Как улучшить мой код или какой шаблон мне нужно использовать.
Мои шаблоны совпадают с карточками, которые я хочу учитывать. Любой совет лучше, чем TM_CCOEFF_NORMED
import cv2
import numpy as np
import tkinter as tk
import threading
import time
import pyautogui
from datetime import datetime, timedelta

# Kart şablonlarını yükle
card_templates = {
'2_sinek': cv2.imread('kartlar/2s.png', cv2.IMREAD_GRAYSCALE),
'2_kupa': cv2.imread('kartlar/2k.png', cv2.IMREAD_GRAYSCALE),
'2_maça': cv2.imread('kartlar/2m.png', cv2.IMREAD_GRAYSCALE),
'2_karo': cv2.imread('kartlar/2q.png', cv2.IMREAD_GRAYSCALE),
'3_sinek': cv2.imread('kartlar/3s.png', cv2.IMREAD_GRAYSCALE),
'3_kupa': cv2.imread('kartlar/3k.png', cv2.IMREAD_GRAYSCALE),
'3_maça': cv2.imread('kartlar/3m.png', cv2.IMREAD_GRAYSCALE),
...
}

card_counts = {card.split('_')[0]: 0 for card in card_templates.keys()}

card_last_seen = {card: None for card in card_templates.keys()} # Son görülen zaman

# HERE
def capture_screen(region=None):
if region:
# Belirli bir bölgenin ekran görüntüsünü al
screen = np.array(pyautogui.screenshot(region=region))
else:
# Tüm ekranın görüntüsünü al
screen = np.array(pyautogui.screenshot())

screen = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) # RGB -> BGR
return screen
# Kartları tespit et
def detect_cards(screen):
gray_screen = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)
detected_cards = {}

for card, template in card_templates.items():
result = cv2.matchTemplate(gray_screen, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.98 # Eşleşme oranı
locations = np.where(result >= threshold)

for pt in zip(*locations[::-1]):
if card not in detected_cards:
detected_cards[card] = []
detected_cards[card].append(pt)

return detected_cards

def update_display(stop_event):
global root, labels

root = tk.Tk()
root.title("Kart Sayımı")

# Kart sayıları için etiketler
labels = {}
for i, card in enumerate(card_counts.keys()):
label = tk.Label(root, text=f"{card}: {card_counts[card]}", font=('Helvetica', 14))
label.grid(row=i, column=0)
labels[card] = label

# "Yenile" butonunu oluştur
def reset_counts():
reset_gui()

reset_button = tk.Button(root, text="Yenile", command=reset_counts)
reset_button.grid(row=len(card_counts), column=0)

def update():
if not stop_event.is_set():
sorted_cards = sorted(card_counts.items(), key=lambda x: (x[1] != 3, x[1] != 4, x[0]))
for idx, (card, count) in enumerate(sorted_cards):
color = 'red' if count == 3 else 'green' if count == 4 else 'black'
labels[card].config(text=f"{card}: {count}", fg=color)
labels[card].grid(row=idx, column=0)
root.after(500, update) # 0.5 saniye sonra tekrar çalıştır

update()
root.mainloop()

def track_cards(stop_event):
global card_last_seen # card_last_seen değişkenini global olarak kullan
last_reset_time = datetime.now()

while not stop_event.is_set():
region = (400, 0, 1000, 1000)
screen = capture_screen(region=region)

detected_cards = detect_cards(screen)
# Sayıları güncelle
for card, locations in detected_cards.items():
card_number = card.split('_')[0]

# Eğer kart 100 saniye içinde sayılmadıysa
if card_last_seen[card] is None or datetime.now() - card_last_seen[card] > timedelta(seconds=100):
# Kart sayılabilir, sayımı artır
card_counts[card_number] += 1
card_last_seen[card] = datetime.now() # Kartı saydık, son görülen zamanı güncelle

# Kart sayımlarını anlık olarak güncelle
print(f"Detected cards: {detected_cards}")
print(f"Card counts: {card_counts}")

# 0.1 saniye sonra tekrar çalıştır
time.sleep(0.2)

def reset_gui():
global card_counts, card_last_seen

card_counts = {card.split('_')[0]: 0 for card in card_templates.keys()}
card_last_seen = {card: None for card in card_templates.keys()}

for card in labels:
labels[card].config(text=f"{card}: 0", fg='black')

stop_event = threading.Event()

def start_gui_thread():
thread_gui = threading.Thread(target=update_display, args=(stop_event,))
thread_gui.daemon = True
thread_gui.start()

def start_tracking():
track_cards(stop_event)

start_gui_thread() # GUI'yi başlat
start_tracking() # Kartları takip etmeye başla


Подробнее здесь: https://stackoverflow.com/questions/793 ... d-counting
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сопоставление шаблонов для подсчета корзин
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Сопоставление шаблонов OpenCV с использованием прозрачных шаблонов
    Anonymous » » в форуме Python
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Сопоставление шаблонов OpenCV с использованием прозрачных шаблонов
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Проблема картирования картирования карт. Сопоставление списка объектов в список строк
    Anonymous » » в форуме C#
    0 Ответы
    209 Просмотры
    Последнее сообщение Anonymous
  • Проблема картирования картирования карт. Сопоставление списка объектов в список строк
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»