Spaces:
Sleeping
A newer version of the Gradio SDK is available:
5.15.0
title: Odev Trajektori Analizi
emoji: 🔥
colorFrom: yellow
colorTo: gray
sdk: gradio
sdk_version: 5.10.0
app_file: app.py
pinned: false
Kırmızı Topun Trajektori Analizi
Proje Konusu
Bu proje, kırmızı topun yuvarlanırken izlediği yolu analiz etmeyi amaçlamaktadır. Video işleme teknikleri kullanılarak, topun yolunun doğruluğu belirlenir ve "ok" veya "not ok" şeklinde raporlanır.
Kullanılan Yöntemler ve Teknikler
HSV Renk Maskesi Oluşturma
Videodan gelen her bir çerçeve, HSV renk uzayına dönüştürülür ve kırmızı renklerin maskesi oluşturulur.
def create_mask(frame):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask1 = cv2.inRange(hsv, (0, 120, 70), (10, 255, 255))
mask2 = cv2.inRange(hsv, (170, 120, 70), (180, 255, 255))
mask = mask1 | mask2
return mask
Morfolojik İşlemler
Kırmızı renk maskesi üzerine uygulanan morfolojik işlemlerle, gürültü ve küçük istenmeyen nesneler temizlenir.
def apply_morphology(mask, kernel_size=15):
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
morph = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
return morph
En Büyük Bileşeni Bulma
Morfolojik işlemler sonrası en büyük bağlı bileşenin merkezi bulunur.
def find_largest_component(morph):
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(morph, connectivity=8)
if num_labels > 1:
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
cX = int(centroids[largest_label][0])
cY = int(centroids[largest_label][1])
return cX, cY
else:
return None
Topun İzlediği Yolu Çizme
Kırmızı topun izlediği yolu çizen fonksiyon.
def draw_trajectory(frame, trajectory):
if len(trajectory) > 1:
pts = np.array(trajectory, np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(frame, [pts], False, (0, 255, 0), 2)
Yolu Analiz Etme
Trajektori analizini yaparak topun yolunun düzgün mü yoksa yalpalamalı mı olduğunu değerlendirir.
def analyze_trajectory(trajectory, std_threshold=10):
if len(trajectory) < 2:
return "Yolu belirlemek için yeterli veri yok."
else:
x_coords = np.array(trajectory)[:, 0]
std_x = np.std(x_coords)
return "ok" if std_x < std_threshold else "not ok"
Video İşleme ve Çıktı Alma
Videodaki kırmızı topun yolunu analiz eden ve çıktı üreten ana fonksiyon.
def process_video(video, kernel_size=15, std_threshold=10):
try:
cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
_, frame = cap.read()
if frame is None:
return "Videodan çerçeve okunamadı!", None, None
fourcc = cv2.VideoWriter_fourcc(*'XVID')
height, width = frame.shape[:2]
try:
out_mask = cv2.VideoWriter('mask_output.avi', fourcc, fps, (width, height), False)
out_final = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
except:
return "Video dosyaları oluşturulamadı!", None, None
trajectory = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
mask = create_mask(frame)
out_mask.write(mask)
morph = apply_morphology(mask, kernel_size)
center = find_largest_component(morph)
if center:
cX, cY = center
trajectory.append((cX, cY))
cv2.circle(frame, (cX, cY), 5, (0, 255, 0), -1)
draw_trajectory(frame, trajectory)
out_final.write(frame)
cap.release()
out_mask.release()
out_final.release()
result_text = analyze_trajectory(trajectory, std_threshold)
return result_text, 'mask_output.avi', 'output.avi'
except:
return "Video işlenirken bir hata oluştu!", None, None
Kullanıcı Arayüzü
Gradio kullanılarak oluşturulan kullanıcı dostu arayüz, işlem parametrelerinin ayarlanmasını sağlar.
demo = gr.Interface(
fn=process_video,
inputs=[
gr.Video(label="Girdi Video"),
gr.Slider(1, 50, value=15, step=1, label="Kernel Boyutu"),
gr.Slider(1, 100, value=10, step=1, label="Standart Sapma Eşiği")
],
outputs=[
gr.Textbox(label="Yol Analiz Sonucu"),
gr.Video(label="Maske Video"),
gr.Video(label="Çıktı Video")
],
examples=[
["ok.mp4", 15, 10],
["not_ok1.mp4", 15, 10],
["not_ok2.mp4", 15, 10]
]
)
if __name__ == "__main__":
demo.launch(show_error=True)
Sonuçlar ve Yorumlar
- Maske Video: Kırmızı topun tespit edildiği maskeli video.
- Çıktı Video: Kırmızı topun izlediği yolun ve merkezinin işaretlendiği video.
- Yol Analiz Sonucu: Standart sapmaya bağlı olarak yolun düz mü (ok) yoksa eğri mi (not ok) olduğu tespit edilir.
Olası Alternatif Durumlarda Kullanılabilecek Yöntemler
- Klasik Eşik Değerleme: HSV renk uzayında sabit eşik değerleri yerine, histogram eşik değerleme gibi yöntemlerle daha dinamik bir maske oluşturulabilir.
- Adaptif Eşikleme: Aydınlatma koşullarında değişikliklere karşı daha dayanıklı olabilmesi için yerel donanım koşullarını dikkate alan adaptif eşikleme yöntemleri kullanılabilir.
- Kalman Filtresi: Kırmızı topun hareket tahminini iyileştirmek için Kalman filtresi gibi yöntemler kullanılabilir.
- Morfolojik Açma (Opening): Kapama (closing) yerine açma (opening) işlemi de denenerek küçük gürültü noktalarının temizlenmesi ve topun daha belirgin hale getirilmesi sağlanabilir.