Spaces:
Sleeping
Sleeping
Update README.md
Browse files
README.md
CHANGED
@@ -9,4 +9,151 @@ app_file: app.py
|
|
9 |
pinned: false
|
10 |
---
|
11 |
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
pinned: false
|
10 |
---
|
11 |
|
12 |
+
# Kırmızı Topun Trajektori Analizi
|
13 |
+
|
14 |
+
## Proje Konusu
|
15 |
+
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.
|
16 |
+
|
17 |
+
## Kullanılan Yöntemler ve Teknikler
|
18 |
+
|
19 |
+
### HSV Renk Maskesi Oluşturma
|
20 |
+
Videodan gelen her bir çerçeve, HSV renk uzayına dönüştürülür ve kırmızı renklerin maskesi oluşturulur.
|
21 |
+
|
22 |
+
```python
|
23 |
+
def create_mask(frame):
|
24 |
+
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
|
25 |
+
mask1 = cv2.inRange(hsv, (0, 120, 70), (10, 255, 255))
|
26 |
+
mask2 = cv2.inRange(hsv, (170, 120, 70), (180, 255, 255))
|
27 |
+
mask = mask1 | mask2
|
28 |
+
return mask
|
29 |
+
```
|
30 |
+
|
31 |
+
### Morfolojik İşlemler
|
32 |
+
Kırmızı renk maskesi üzerine uygulanan morfolojik işlemlerle, gürültü ve küçük istenmeyen nesneler temizlenir.
|
33 |
+
|
34 |
+
```python
|
35 |
+
def apply_morphology(mask, kernel_size=15):
|
36 |
+
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
|
37 |
+
morph = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
|
38 |
+
return morph
|
39 |
+
```
|
40 |
+
|
41 |
+
### En Büyük Bileşeni Bulma
|
42 |
+
Morfolojik işlemler sonrası en büyük bağlı bileşenin merkezi bulunur.
|
43 |
+
|
44 |
+
```python
|
45 |
+
def find_largest_component(morph):
|
46 |
+
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(morph, connectivity=8)
|
47 |
+
if num_labels > 1:
|
48 |
+
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
|
49 |
+
cX = int(centroids[largest_label][0])
|
50 |
+
cY = int(centroids[largest_label][1])
|
51 |
+
return cX, cY
|
52 |
+
else:
|
53 |
+
return None
|
54 |
+
```
|
55 |
+
|
56 |
+
### Topun İzlediği Yolu Çizme
|
57 |
+
Kırmızı topun izlediği yolu çizen fonksiyon.
|
58 |
+
|
59 |
+
```python
|
60 |
+
def draw_trajectory(frame, trajectory):
|
61 |
+
if len(trajectory) > 1:
|
62 |
+
pts = np.array(trajectory, np.int32)
|
63 |
+
pts = pts.reshape((-1, 1, 2))
|
64 |
+
cv2.polylines(frame, [pts], False, (0, 255, 0), 2)
|
65 |
+
```
|
66 |
+
|
67 |
+
### Yolu Analiz Etme
|
68 |
+
Trajektori analizini yaparak topun yolunun düzgün mü yoksa yalpalamalı mı olduğunu değerlendirir.
|
69 |
+
|
70 |
+
```python
|
71 |
+
def analyze_trajectory(trajectory, std_threshold=10):
|
72 |
+
if len(trajectory) < 2:
|
73 |
+
return "Yolu belirlemek için yeterli veri yok."
|
74 |
+
else:
|
75 |
+
x_coords = np.array(trajectory)[:, 0]
|
76 |
+
std_x = np.std(x_coords)
|
77 |
+
return "ok" if std_x < std_threshold else "not ok"
|
78 |
+
```
|
79 |
+
|
80 |
+
### Video İşleme ve Çıktı Alma
|
81 |
+
Videodaki kırmızı topun yolunu analiz eden ve çıktı üreten ana fonksiyon.
|
82 |
+
|
83 |
+
```python
|
84 |
+
def process_video(video, kernel_size=15, std_threshold=10):
|
85 |
+
try:
|
86 |
+
cap = cv2.VideoCapture(video)
|
87 |
+
fps = cap.get(cv2.CAP_PROP_FPS)
|
88 |
+
_, frame = cap.read()
|
89 |
+
if frame is None:
|
90 |
+
return "Videodan çerçeve okunamadı!", None, None
|
91 |
+
fourcc = cv2.VideoWriter_fourcc(*'XVID')
|
92 |
+
height, width = frame.shape[:2]
|
93 |
+
try:
|
94 |
+
out_mask = cv2.VideoWriter('mask_output.avi', fourcc, fps, (width, height), False)
|
95 |
+
out_final = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
|
96 |
+
except:
|
97 |
+
return "Video dosyaları oluşturulamadı!", None, None
|
98 |
+
trajectory = []
|
99 |
+
while cap.isOpened():
|
100 |
+
ret, frame = cap.read()
|
101 |
+
if not ret:
|
102 |
+
break
|
103 |
+
mask = create_mask(frame)
|
104 |
+
out_mask.write(mask)
|
105 |
+
morph = apply_morphology(mask, kernel_size)
|
106 |
+
center = find_largest_component(morph)
|
107 |
+
if center:
|
108 |
+
cX, cY = center
|
109 |
+
trajectory.append((cX, cY))
|
110 |
+
cv2.circle(frame, (cX, cY), 5, (0, 255, 0), -1)
|
111 |
+
draw_trajectory(frame, trajectory)
|
112 |
+
out_final.write(frame)
|
113 |
+
cap.release()
|
114 |
+
out_mask.release()
|
115 |
+
out_final.release()
|
116 |
+
result_text = analyze_trajectory(trajectory, std_threshold)
|
117 |
+
return result_text, 'mask_output.avi', 'output.avi'
|
118 |
+
except:
|
119 |
+
return "Video işlenirken bir hata oluştu!", None, None
|
120 |
+
```
|
121 |
+
|
122 |
+
### Kullanıcı Arayüzü
|
123 |
+
Gradio kullanılarak oluşturulan kullanıcı dostu arayüz, işlem parametrelerinin ayarlanmasını sağlar.
|
124 |
+
|
125 |
+
```python
|
126 |
+
demo = gr.Interface(
|
127 |
+
fn=process_video,
|
128 |
+
inputs=[
|
129 |
+
gr.Video(label="Girdi Video"),
|
130 |
+
gr.Slider(1, 50, value=15, step=1, label="Kernel Boyutu"),
|
131 |
+
gr.Slider(1, 100, value=10, step=1, label="Standart Sapma Eşiği")
|
132 |
+
],
|
133 |
+
outputs=[
|
134 |
+
gr.Textbox(label="Yol Analiz Sonucu"),
|
135 |
+
gr.Video(label="Maske Video"),
|
136 |
+
gr.Video(label="Çıktı Video")
|
137 |
+
],
|
138 |
+
examples=[
|
139 |
+
["ok.mp4", 15, 10],
|
140 |
+
["not_ok1.mp4", 15, 10],
|
141 |
+
["not_ok2.mp4", 15, 10]
|
142 |
+
]
|
143 |
+
)
|
144 |
+
|
145 |
+
if __name__ == "__main__":
|
146 |
+
demo.launch(show_error=True)
|
147 |
+
```
|
148 |
+
|
149 |
+
## Sonuçlar ve Yorumlar
|
150 |
+
- **Maske Video**: Kırmızı topun tespit edildiği maskeli video.
|
151 |
+
- **Çıktı Video**: Kırmızı topun izlediği yolun ve merkezinin işaretlendiği video.
|
152 |
+
- **Yol Analiz Sonucu**: Standart sapmaya bağlı olarak yolun düz mü (ok) yoksa eğri mi (not ok) olduğu tespit edilir.
|
153 |
+
|
154 |
+
## Olası Alternatif Durumlarda Kullanılabilecek Yöntemler
|
155 |
+
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.
|
156 |
+
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.
|
157 |
+
3. **Kalman Filtresi**: Kırmızı topun hareket tahminini iyileştirmek için Kalman filtresi gibi yöntemler kullanılabilir.
|
158 |
+
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.
|
159 |
+
|