Eksik nesne sorusu dahil

 avatar
unknown
python
a year ago
9.1 kB
4
Indexable
import cv2
import numpy as np
import time
import random
import os
from PIL import Image, ImageDraw, ImageFont

def nesne_ciz(canvas, pos, nesne_img, nesne_boyutu):
    """Nesneyi tuvale çizer ve PNG dosyasındaki alfa kanalını kullanarak transparan arka planı korur"""
    for c in range(3):
        canvas[pos[1] - nesne_boyutu//2:pos[1] + nesne_boyutu//2, 
               pos[0] - nesne_boyutu//2:pos[0] + nesne_boyutu//2, c] = \
            nesne_img[:, :, c] * (nesne_img[:, :, 3] / 255.0) + canvas[pos[1] - nesne_boyutu//2:pos[1] + nesne_boyutu//2, pos[0] - nesne_boyutu//2:pos[0] + nesne_boyutu//2, c] * (1.0 - nesne_img[:, :, 3] / 255.0)

def draw_text_with_pil(image, text, position, font_path="arial.ttf", font_size=30, color=(0, 0, 0)):
    """Türkçe karakterleri destekleyen metin çizim fonksiyonu"""
    pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(pil_image)
    font = ImageFont.truetype(font_path, font_size)
    draw.text(position, text, font=font, fill=color)
    return cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

def acilan_nesne_yatay(n, v, t):
    """Nesneleri belirli aralıklarla yatay olarak ekrana yerleştirir ve gösterir"""
    n = max(6, min(n, 12))
    t = max(60, min(t, 5 * 60))
    v = max(1, min(v, 3))
    hiz = 750 // (2 ** (v - 1))

    canvas_w, canvas_h = 1100, 600
    nesne_boyutu, nesne_aralik = 80, 5
    nesne_set = nesne_boyutu + nesne_aralik
    nesne_dizin = "../Sprint_2/emojis/"
    not_emoji_dizin = "../Sprint_2/not emoji/"
    nesne_listesi = [os.path.join(nesne_dizin, f) for f in os.listdir(nesne_dizin) if f.endswith('.png')]
    not_emoji_listesi = [os.path.join(not_emoji_dizin, f) for f in os.listdir(not_emoji_dizin) if f.endswith('.png')]

    start_time = time.time()
    nesneler = []  # Görüntülenen nesneleri kaydetmek için liste

    while time.time() - start_time < t:
        
        random_indices = random.sample(range(len(nesne_listesi)), n)

        for i in range(1, n + 1):
            canvas = np.ones((canvas_h, canvas_w, 3), dtype="uint8") * 255
            rect_x1 = (canvas_w - ((nesne_set * n) - nesne_aralik)) // 2
            rect_y1 = (canvas_h - nesne_set) // 2

            cv2.rectangle(canvas, (rect_x1, rect_y1), (rect_x1 + (nesne_set * n) - nesne_aralik, rect_y1 + nesne_set), (220, 220, 220), -1)

            for j in range(i):
                pos = (rect_x1 + j * nesne_set + nesne_boyutu // 2, canvas_h // 2)
                nesne_img = cv2.imread(nesne_listesi[random_indices[j % len(nesne_listesi)]], cv2.IMREAD_UNCHANGED)
                nesne_img = cv2.resize(nesne_img, (nesne_boyutu, nesne_boyutu))
                nesne_ciz(canvas, pos, nesne_img, nesne_boyutu)
                nesneler.append(random_indices[j % len(nesne_listesi)])  # Nesneyi kaydet

            cv2.imshow("Nesne Takibi", canvas)
            if cv2.waitKey(hiz) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                return

    cv2.destroyAllWindows()
    
    # Egzersiz bittikten sonra soru sorma bölümü
    soru_tipi = random.choice(['ilk', 'son', 'eksik', 'cok', 'ilk_yan', 'son_yan'])
    if soru_tipi == 'ilk':
        soru = "İlk nesne hangisidir?"
        dogru_cevap_index = nesneler[0]
    elif soru_tipi == 'son':
        soru = "Son nesne hangisidir?"
        dogru_cevap_index = nesneler[-1]
    elif soru_tipi == 'eksik':
        soru = "Hangi nesne ekrana hiç gelmemiştir?"
        eksik_nesne = random.choice(not_emoji_listesi)
        dogru_cevap_index = eksik_nesne
    elif soru_tipi == 'cok':
        soru = "En çok çıkan nesne hangisidir?"
        dogru_cevap_index = max(set(nesneler), key=nesneler.count)
    elif soru_tipi == 'ilk_yan':
        soru = "İlk çıkan nesnenin sağında hangi nesne vardı?"
        dogru_cevap_index = nesneler[1]
    elif soru_tipi == 'son_yan':
        soru = "Son çıkan nesnenin solunda hangi nesne vardı?"
        dogru_cevap_index = nesneler[-2] 

    if soru_tipi == 'eksik':
        secenekler = random.sample(range(len(nesne_listesi)), 2)
        secenekler.append(eksik_nesne)
    else:
        secenekler = random.sample(range(len(nesne_listesi)), 3)
        if dogru_cevap_index not in secenekler:
            secenekler[0] = dogru_cevap_index #doğru cevabın şıklar içinde olmasını sağlar
    random.shuffle(secenekler)

    # Soru ve seçenekleri ekranda göster
    soru_canvas = np.ones((canvas_h, canvas_w, 3), dtype="uint8") * 255
    soru_canvas = draw_text_with_pil(soru_canvas, soru, (50, 50))

    secenek_pos = [(canvas_w // 4, canvas_h // 2), (canvas_w // 2, canvas_h // 2), (3 * canvas_w // 4, canvas_h // 2)]
    for idx, secenek in enumerate(secenekler):
        if soru_tipi == 'eksik' and secenek == eksik_nesne:
            nesne_img = cv2.imread(eksik_nesne, cv2.IMREAD_UNCHANGED)
        else:
            nesne_img = cv2.imread(nesne_listesi[secenek], cv2.IMREAD_UNCHANGED)
        nesne_img = cv2.resize(nesne_img, (nesne_boyutu, nesne_boyutu))
        nesne_ciz(soru_canvas, secenek_pos[idx], nesne_img, nesne_boyutu)

    secim = [-1]  # Tıklanmış seçeneği saklamak için liste

    def mouse_callback(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            for idx, (sx, sy) in enumerate(secenek_pos):
                if sx - nesne_boyutu // 2 < x < sx + nesne_boyutu // 2 and sy - nesne_boyutu // 2 < y < sy + nesne_boyutu // 2:
                    secim[0] = idx
                    break

    cv2.imshow("Soru", soru_canvas)
    cv2.setMouseCallback("Soru", mouse_callback)
    
    while secim[0] == -1:
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            return

    # Seçim kontrolü ve geri bildirim
    yesil_tik = cv2.imread("../Sprint_2/2714(2).png", cv2.IMREAD_UNCHANGED)
    yesil_tik = cv2.resize(yesil_tik, (40, 40))
    kirmizi_carpi = cv2.imread("../Sprint_2/274c(2).png", cv2.IMREAD_UNCHANGED)
    kirmizi_carpi = cv2.resize(kirmizi_carpi, (40, 40)) 
    
    if soru_tipi == 'eksik':
        if secenekler[secim[0]] == eksik_nesne:
            cv2.rectangle(soru_canvas, (secenek_pos[secim[0]][0] - nesne_boyutu // 2, secenek_pos[secim[0]][1] - nesne_boyutu // 2), 
                          (secenek_pos[secim[0]][0] + nesne_boyutu // 2, secenek_pos[secim[0]][1] + nesne_boyutu // 2), (0, 255, 0), 5)
            nesne_ciz(soru_canvas, (secenek_pos[secim[0]][0], secenek_pos[secim[0]][1] + nesne_boyutu), yesil_tik, 40)
        else:
            cv2.rectangle(soru_canvas, (secenek_pos[secim[0]][0] - nesne_boyutu // 2, secenek_pos[secim[0]][1] - nesne_boyutu // 2), 
                          (secenek_pos[secim[0]][0] + nesne_boyutu // 2, secenek_pos[secim[0]][1] + nesne_boyutu // 2), (0, 0, 255), 5)
            nesne_ciz(soru_canvas, (secenek_pos[secim[0]][0], secenek_pos[secim[0]][1] + nesne_boyutu), kirmizi_carpi, 40)
            # Doğru cevabı işaretle
            dogru_idx = secenekler.index(eksik_nesne)
            cv2.rectangle(soru_canvas, (secenek_pos[dogru_idx][0] - nesne_boyutu // 2, secenek_pos[dogru_idx][1] - nesne_boyutu // 2), 
                          (secenek_pos[dogru_idx][0] + nesne_boyutu // 2, secenek_pos[dogru_idx][1] + nesne_boyutu // 2), (0, 255, 0), 5)
            nesne_ciz(soru_canvas, (secenek_pos[dogru_idx][0], secenek_pos[dogru_idx][1] + nesne_boyutu), yesil_tik, 40)
    else:
        if secenekler[secim[0]] == dogru_cevap_index:
            cv2.rectangle(soru_canvas, (secenek_pos[secim[0]][0] - nesne_boyutu // 2, secenek_pos[secim[0]][1] - nesne_boyutu // 2), 
                          (secenek_pos[secim[0]][0] + nesne_boyutu // 2, secenek_pos[secim[0]][1] + nesne_boyutu // 2), (0, 255, 0), 5)
            nesne_ciz(soru_canvas, (secenek_pos[secim[0]][0], secenek_pos[secim[0]][1] + nesne_boyutu), yesil_tik, 40)
        else:
            cv2.rectangle(soru_canvas, (secenek_pos[secim[0]][0] - nesne_boyutu // 2, secenek_pos[secim[0]][1] - nesne_boyutu // 2), 
                          (secenek_pos[secim[0]][0] + nesne_boyutu // 2, secenek_pos[secim[0]][1] + nesne_boyutu // 2), (0, 0, 255), 5)
            nesne_ciz(soru_canvas, (secenek_pos[secim[0]][0], secenek_pos[secim[0]][1] + nesne_boyutu), kirmizi_carpi, 40)
            # Doğru cevabı işaretle
            dogru_idx = secenekler.index(dogru_cevap_index)
            cv2.rectangle(soru_canvas, (secenek_pos[dogru_idx][0] - nesne_boyutu // 2, secenek_pos[dogru_idx][1] - nesne_boyutu // 2), 
                          (secenek_pos[dogru_idx][0] + nesne_boyutu // 2, secenek_pos[dogru_idx][1] + nesne_boyutu // 2), (0, 255, 0), 5)
            nesne_ciz(soru_canvas, (secenek_pos[dogru_idx][0], secenek_pos[dogru_idx][1] + nesne_boyutu), yesil_tik, 40)    
            
    cv2.imshow("Soru", soru_canvas)
    cv2.waitKey(2000)
    cv2.destroyAllWindows()
    
# Örnek kullanım
acilan_nesne_yatay(n=6, v=3, t=60)
acilan_nesne_yatay(n=8, v=3, t=60)    
Editor is loading...
Leave a Comment