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.