Spaces:
Sleeping
Sleeping
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) |