|
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"), |
|
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) |