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