import cv2 import numpy as np import gradio as gr def create_mask(frame): """Frame'de kırmızı renk maskesi oluşturur.""" 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 def apply_morphology(mask, kernel_size=15): """Maskeye morfolojik işlemler uygular.""" kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size)) morph = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) return morph def find_largest_component(morph): """En büyük bağlı bileşenin merkezini bulur.""" 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 def draw_trajectory(frame, trajectory): """Topun izlediği yolu çizer.""" 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) def analyze_trajectory(trajectory, std_threshold=10): """Trajektori analizini yapar.""" 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" def process_video(video, kernel_size=15, std_threshold=10): """Videoyu işler ve topun yörüngesini analiz eder.""" 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 demo = gr.Interface( fn=process_video, inputs=[ gr.Video(label="Girdi Video"), gr.Slider(1, 50, value=15, step=1, label="Kernel Boyutu"), # Accordion içindeki bileşenler ayrı ayrı eklendi gr.Slider(1, 100, value=10, step=1, label="Standart Sapma Eşiği") # Accordion içindeki bileşenler ayrı ayrı eklendi ], 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] ] ) # Launch the Gradio app if __name__ == "__main__": demo.launch(show_error=True)