--- 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. ```python 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. ```python 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. ```python 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. ```python 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. ```python 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. ```python 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. ```python 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.