WildGenie's picture
Update README.md
515d54f verified
---
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.