WildGenie's picture
Update app.py
9bda3b4 verified
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)