Eksik olan nesne sorusu hariç

 avatar
unknown
python
a year ago
7.5 kB
6
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.
    PNG dosyasındaki şeffaf alanları doğru şekilde hesaba katarak nesneyi canvas üzerine çizer 
    ve nesne, arka plandaki diğer görüntülerle düzgün bir şekilde birleşir."""
    for c in range(3): #r,g,b 3 kanal
        #pos[0] ve pos[1] nesnenin canvastaki merkez koordinatları
        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)

#fonttaki Türkçe karakterler için kullanıldı.       
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)) #hızlanmayı 2'nin kuvvetleriyle ilerlettik. m5 1.seviyede sanki 750 kullanıyor. 

    canvas_w, canvas_h = 1100, 600
    nesne_boyutu, nesne_aralik = 80, 5
    nesne_set = nesne_boyutu + nesne_aralik #nesneler ve boşluklar tekrarlı olduğu için boyle bir set yapıldı.
    nesne_dizin = "../Sprint_2/emojis/"
    nesne_listesi = [os.path.join(nesne_dizin, f) for f in os.listdir(nesne_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', '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 == '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]

    secenekler = random.sample(range(len(nesne_listesi)), 3)
    if dogru_cevap_index not in secenekler:
        secenekler[0] = dogru_cevap_index
    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):
        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 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), 4)
        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), 4)
        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), 4)
        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(1000)
    cv2.destroyAllWindows()

# Örnek kullanım
acilan_nesne_yatay(n=6, v=3, t=60)
acilan_nesne_yatay(n=12, v=2, t=60)
Editor is loading...
Leave a Comment