Eksik olan nesne sorusu hariç
unknown
python
a year ago
7.5 kB
9
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