WildGenie's picture
Update README.md
515d54f verified

A newer version of the Gradio SDK is available: 5.15.0

Upgrade
metadata
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

  1. 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.
  2. 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.
  3. Kalman Filtresi: Kırmızı topun hareket tahminini iyileştirmek için Kalman filtresi gibi yöntemler kullanılabilir.
  4. 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.