Spaces:
Sleeping
Sleeping
File size: 5,852 Bytes
25b571b 515d54f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
---
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.
|