Eksik nesne sorusu dahil
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