Vorlagenabgleich für die WarenkorbzählungPython

Python-Programme
Guest
 Vorlagenabgleich für die Warenkorbzählung

Post by Guest »

Ich weiß wirklich nichts über Python, ich habe diese Codes nur mit Chatgpt und meinem IQ-Effekt erstellt. Ich möchte fragen: Wie kann ich eine schnellere Warenkorbzähler-App erstellen? Ich habe das für das Pishti-Spiel gemacht. Es funktioniert, zählt, geht aber manchmal vorbei. Wie ich meinen Code verbessern kann oder welche Vorlagenübereinstimmung ich verwenden muss.
Meine Vorlagen sind identisch mit den Karten, die gezählt werden sollen. Gibt es einen besseren Rat als TM_CCOEFF_NORMED

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post