WildGenie commited on
Commit
515d54f
·
verified ·
1 Parent(s): 9bda3b4

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +148 -1
README.md CHANGED
@@ -9,4 +9,151 @@ app_file: app.py
9
  pinned: false
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+