Eksik olan nesne sorusu hariç
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