cvflair 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,26 @@
1
+ # Değişiklik günlüğü
2
+
3
+ Sürümleme [Semantic Versioning](https://semver.org/lang/tr/) izler.
4
+ Paket henüz PyPI'da yayınlanmadı; sürümler depo içi kilometre taşlarıdır.
5
+
6
+ ## 0.2.0
7
+
8
+ ### Eklendi
9
+ - `Camera.stream(model=...)`: model verildiğinde akış `(kare, tespitler)` çifti üretir.
10
+ - `cvflair.models`: ağırlık yolu, hazır Ultralytics modeli veya `sv.Detections`
11
+ döndüren herhangi bir çağrılabilir aynı detektör arayüzüne çevriliyor.
12
+ - `UltralyticsDetector` — `conf`, `iou`, `device` gibi ayarları her çağrıya taşır,
13
+ `verbose` varsayılan olarak kapalı.
14
+ - `yolo` extra'sı (`pip install "cvflair[yolo]"`). Ultralytics AGPL-3.0 olduğu için
15
+ zorunlu bağımlılık değil; eksikse hata mesajı extra'yı ve lisans gerekçesini söylüyor.
16
+ - `examples/yolo_quickstart.py`.
17
+
18
+ ## 0.1.0
19
+
20
+ ### Eklendi
21
+ - `Camera`: webcam açma, ayrı thread'de okuma, son kareyi tutan tek slotlu kuyruk,
22
+ `q`/ESC ile biten `stream()` akışı.
23
+ - `Theme`: `supervision` annotator'larını yapılandıran katman; `minimal`, `neon`,
24
+ `pastel` temaları. Annotator'lar tema kurulurken bir kez oluşturuluyor.
25
+ - Türkçe README, `docs/demo.gif` üreten `tools/make_demo_gif.py`, kamerasız örnekler.
26
+ - Kamera gerektirmeyen pytest paketi (sahte `capture_factory`).
cvflair-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kbycode
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,12 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+
5
+ # Testler sdist'ten de çalışabilsin: conftest.py olmadan test dosyaları import edilemiyor.
6
+ recursive-include tests *.py
7
+ recursive-include examples *.py
8
+ recursive-include tools *.py
9
+
10
+ # Dokümantasyon görselleri depoda duruyor, pakete girmiyor (README mutlak URL kullanıyor).
11
+ prune docs
12
+ prune .github
cvflair-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,249 @@
1
+ Metadata-Version: 2.4
2
+ Name: cvflair
3
+ Version: 0.2.0
4
+ Summary: Theme-based, model-agnostic visualisation layer for computer vision detections, built on supervision.
5
+ Author: kbycode
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/kbycode/cvflair
8
+ Project-URL: Documentation, https://github.com/kbycode/cvflair#readme
9
+ Project-URL: Repository, https://github.com/kbycode/cvflair
10
+ Project-URL: Issues, https://github.com/kbycode/cvflair/issues
11
+ Project-URL: Changelog, https://github.com/kbycode/cvflair/blob/main/CHANGELOG.md
12
+ Keywords: computer-vision,opencv,supervision,annotation,visualization,webcam,yolo,bounding-box,themes
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Education
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
25
+ Classifier: Topic :: Multimedia :: Video :: Display
26
+ Requires-Python: >=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: numpy>=1.24
30
+ Requires-Dist: opencv-python>=4.8
31
+ Requires-Dist: supervision<0.30,>=0.28
32
+ Provides-Extra: yolo
33
+ Requires-Dist: ultralytics>=8.2; extra == "yolo"
34
+ Provides-Extra: dev
35
+ Requires-Dist: pytest>=8.0; extra == "dev"
36
+ Requires-Dist: ruff>=0.6; extra == "dev"
37
+ Requires-Dist: pillow>=10.0; extra == "dev"
38
+ Provides-Extra: release
39
+ Requires-Dist: build>=1.2; extra == "release"
40
+ Requires-Dist: twine>=5.0; extra == "release"
41
+ Dynamic: license-file
42
+
43
+ # cvflair
44
+
45
+ Bilgisayarlı görü tespitlerini üç satırda, hazır temalarla ekrana çizen ince bir katman.
46
+
47
+ Çizim işini [supervision](https://github.com/roboflow/supervision) yapar; cvflair kamera
48
+ döngüsünü ve tema ayarlarını üstlenir. Model bağımsızdır: `supervision`'ın `Detections`
49
+ nesnesini üreten her kaynak (YOLO, MediaPipe, InsightFace veya özel bir model) tema
50
+ tarafından çizilebilir.
51
+
52
+ ![cvflair demo](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/demo.gif)
53
+
54
+ *Aynı tespitler, üç tema. Animasyon `tools/make_demo_gif.py` ile üretildi — sentetik
55
+ sahne, kamera gerekmiyor.*
56
+
57
+ > **Durum:** Faz 1 tamam (kamera döngüsü, üç tema, testler), Faz 2 başladı (model
58
+ > bağlama). Paket henüz PyPI'da yayınlanmadı.
59
+
60
+ ## Kurulum
61
+
62
+ Python 3.10 veya üzeri gerekir (bu alt sınır `supervision`'dan geliyor).
63
+
64
+ ```bash
65
+ git clone https://github.com/kbycode/cvflair.git
66
+ cd cvflair
67
+ pip install -e .
68
+ ```
69
+
70
+ Yayınlandıktan sonra: `pip install cvflair`
71
+
72
+ YOLO ile kullanmak için Ultralytics extra'sı: `pip install -e ".[yolo]"`
73
+ (ayrıntı ve lisans notu için aşağıdaki [Lisans](#lisans) bölümü).
74
+
75
+ ## Hızlı başlangıç
76
+
77
+ ```python
78
+ from cvflair import Camera
79
+
80
+ cam = Camera(source=0, theme="neon")
81
+ for frame in cam.stream():
82
+ cam.show(frame)
83
+ ```
84
+
85
+ Kamera açılır, kareler ayrı bir thread'de okunur, pencere `q` veya ESC ile kapanır —
86
+ `release()` çağırmaya, `while True` kurmaya gerek yok.
87
+
88
+ > Model verilmeyen bu akışta ekranda ham kare görünür: tema ancak ortada tespit
89
+ > varken çizim yapar. Temayı modelsiz, canlı görmek için:
90
+ > `python examples/demo_fake_detections.py` — kamera görüntüsü üzerine hareketli sahte
91
+ > kutular çizer ve temaları 3 saniyede bir değiştirir.
92
+
93
+ ## Modelle kullanım
94
+
95
+ `stream()`'e bir model verildiğinde her adım `(kare, tespitler)` çifti döndürür ve
96
+ tema otomatik uygulanır:
97
+
98
+ ```python
99
+ from cvflair import Camera
100
+
101
+ cam = Camera(source=0, theme="neon")
102
+ for frame, detections in cam.stream(model="yolov8n.pt"):
103
+ cam.show(frame, detections)
104
+ ```
105
+
106
+ `model` üç şeyden biri olabilir:
107
+
108
+ | Değer | Anlamı |
109
+ |---|---|
110
+ | `"yolov8n.pt"` (ağırlık yolu) | Ultralytics ile yüklenir — `cvflair[yolo]` gerekir |
111
+ | Hazır bir Ultralytics modeli | `YOLO(...)` nesnesi doğrudan verilebilir, çıktısı dönüştürülür |
112
+ | Herhangi bir çağrılabilir | `sv.Detections` döndüren kendi fonksiyonun — MediaPipe, InsightFace, özel model |
113
+
114
+ Son seçenek kütüphaneyi model-agnostik yapan yer:
115
+
116
+ ```python
117
+ import supervision as sv
118
+ from cvflair import Camera
119
+
120
+ def detect(frame) -> sv.Detections:
121
+ ... # kendi modelin
122
+ return sv.Detections(xyxy=..., class_id=..., confidence=...)
123
+
124
+ cam = Camera(source=0, theme="pastel")
125
+ for frame, detections in cam.stream(model=detect):
126
+ cam.show(frame, detections)
127
+ ```
128
+
129
+ Çıkarım bu döngüde çalışır, okuma thread'inde değil: bir kare işlenirken okuyucu
130
+ kuyruktaki kareyi tazelemeye devam eder, dolayısıyla bir sonraki tur birikmiş
131
+ kareyle değil en güncel kareyle başlar.
132
+
133
+ Ultralytics'e ek ayar geçirmek için `UltralyticsDetector` doğrudan kullanılabilir:
134
+
135
+ ```python
136
+ from cvflair import Camera, UltralyticsDetector
137
+ from ultralytics import YOLO
138
+
139
+ detector = UltralyticsDetector(YOLO("yolov8n.pt"), conf=0.4, device="cpu", classes=[0])
140
+ cam = Camera(source=0, theme="neon")
141
+ for frame, detections in cam.stream(model=detector):
142
+ cam.show(frame, detections)
143
+ ```
144
+
145
+ Etiket metni doğrudan da verilebilir: `cam.show(frame, detections, labels=[...])`.
146
+ Pencere yönetimi uygulamaya aitse `cam.annotate(frame, detections)` yalnızca çizim yapar.
147
+
148
+ ## Temalar
149
+
150
+ | Tema | Görünüm | |
151
+ |---|---|---|
152
+ | `minimal` | ince beyaz çerçeve, sade etiket — ekran kaydı ve profesyonel demo için | ![minimal](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-minimal.png) |
153
+ | `neon` | sınıf başına canlı renk, yuvarlak köşe, koyu hâle ile parlama hissi | ![neon](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-neon.png) |
154
+ | `pastel` | yumuşak tonlar, geniş yuvarlama, koyu etiket yazısı — atölye/projeksiyon | ![pastel](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-pastel.png) |
155
+
156
+ Yol haritasındaki `cyberpunk` ve `hud` temaları Faz 2'de gelecek.
157
+
158
+ Özel bir tema, `Theme` doğrudan kurulup `Camera`'ya verilerek tanımlanır:
159
+
160
+ ```python
161
+ import supervision as sv
162
+ from cvflair import Camera, Theme
163
+
164
+ my_theme = Theme(
165
+ name="my-theme",
166
+ palette=sv.ColorPalette.from_hex(["#39FF14", "#FF00E5"]),
167
+ box_style="corner", # "box" | "round" | "corner"
168
+ thickness=2,
169
+ glow=True,
170
+ text_scale=0.6,
171
+ )
172
+ cam = Camera(source=0, theme=my_theme)
173
+ ```
174
+
175
+ Temaları görmenin iki yolu:
176
+
177
+ ```bash
178
+ python examples/demo_fake_detections.py # canlı kamera + hareketli sahte tespitler
179
+ python examples/theme_preview.py # kamerasız, her temayı bir PNG'ye çizer
180
+ ```
181
+
182
+ ## API özeti
183
+
184
+ | Üye | Ne yapar |
185
+ |---|---|
186
+ | `Camera(source, theme, width, height, fps, window_name, capture_factory)` | Kaynağı ve temayı bağlar; kamerayı henüz açmaz |
187
+ | `cam.start()` / `cam.close()` | Cihazı açar ve okuma thread'ini başlatır / her şeyi bırakır |
188
+ | `cam.stream(timeout, model=None)` | Kareleri üretir; model verilirse `(kare, tespitler)` çifti. İlk kullanımda `start()`, bitince `close()` eder |
189
+ | `cam.read(timeout)` | En güncel tek kareyi döndürür, kaynak bittiyse `None` |
190
+ | `cam.show(frame, detections, labels)` | Temayı uygular, pencerede gösterir; çıkış istendiğinde `False` döner |
191
+ | `cam.annotate(frame, detections, labels)` | Sadece çizer, pencere açmaz |
192
+ | `cam.theme` | Okunur/yazılır; `cam.theme = "minimal"` çalışır |
193
+ | `cam.frames_read` / `cam.frames_dropped` | Okunan ve tüketici yetişemediği için atılan kare sayısı |
194
+ | `get_theme(ad)` / `available_themes()` | Tema adını çözer / mevcut adları listeler |
195
+ | `UltralyticsDetector(model, **kwargs)` | Ultralytics çıktısını `sv.Detections`'a çevirir; `conf`, `iou`, `device` gibi ayarları taşır |
196
+ | `resolve_detector(model)` | Ağırlık yolu / model / çağrılabilir → detektör; `stream()` bunu kullanır |
197
+
198
+ `Camera` bağlam yöneticisi olarak da kullanılabilir: `with Camera() as cam: ...`
199
+
200
+ ## Nasıl çalışıyor
201
+
202
+ - **Kareler ayrı thread'de okunur.** Okuyucu, tüketiciyi beklemez.
203
+ - **Kuyruk tek slotlu.** Yeni kare gelince bekleyen eski kare düşürülür
204
+ (`frames_dropped` ile sayılır). Böylece işleme yavaşladığında gecikme birikmez;
205
+ ekranda hep en güncel kare olur.
206
+ - **Annotator'lar bir kere kurulur.** `Theme` nesnesi oluşturulurken `supervision`
207
+ annotator'ları hazırlanır ve her karede yeniden kullanılır — döngü içinde annotator
208
+ kurmak bu tür işlerde en sık görülen gereksiz maliyettir.
209
+ - **Çizim matematiği yeniden yazılmadı.** Her piksel `supervision` tarafından çiziliyor;
210
+ cvflair sadece yapılandırma ve akış katmanı.
211
+ - **Model paketin dışında.** `stream(model=...)` verilen şeyi bir çağrılabilire çevirir;
212
+ ağırlıklar ilk yinelemede yüklenir. Hiçbir model kodu veya ağırlığı pakete gömülü değil.
213
+
214
+ ## Geliştirme
215
+
216
+ ```bash
217
+ python -m venv .venv
218
+ .venv\Scripts\activate
219
+ pip install -e ".[dev]"
220
+ pytest
221
+ ruff check .
222
+ ```
223
+
224
+ Testler kamera gerektirmez: `Camera`'ya `capture_factory` üzerinden sahte bir
225
+ `VideoCapture` verilir, temalar da sentetik kareler üzerinde doğrulanır.
226
+
227
+ Dokümantasyon görselleri de kamerasız üretilir:
228
+
229
+ ```bash
230
+ python tools/make_demo_gif.py # docs/demo.gif
231
+ python examples/theme_preview.py # examples/output/theme-*.png
232
+ ```
233
+
234
+ ## Yol haritası
235
+
236
+ | Faz | İçerik | Durum |
237
+ |---|---|---|
238
+ | Faz 1 | Kamera döngüsü, `minimal`/`neon`/`pastel` temaları, README, demo GIF, testler | tamam |
239
+ | Faz 2 | Model bağlama (`stream(model=...)`) | tamam |
240
+ | Faz 2 | PyPI paketi, Türkçe dokümantasyon sitesi, tema playground, `cyberpunk`/`hud` | sırada |
241
+ | Faz 3 | GitHub Actions (lint + test), issue şablonları, örnek galerisi | planlandı |
242
+
243
+ ## Lisans
244
+
245
+ MIT — bkz. [LICENSE](LICENSE). Bağımlılıkların hepsi izin verici lisanslı
246
+ (`supervision` MIT, `opencv-python` Apache 2.0, `numpy` BSD).
247
+
248
+ YOLO ağırlıkları veya Ultralytics kodu bu pakete gömülü değildir; Ultralytics'in
249
+ kullanılması hâlinde AGPL-3.0 koşulları onu kullanan projenin sorumluluğundadır.
@@ -0,0 +1,207 @@
1
+ # cvflair
2
+
3
+ Bilgisayarlı görü tespitlerini üç satırda, hazır temalarla ekrana çizen ince bir katman.
4
+
5
+ Çizim işini [supervision](https://github.com/roboflow/supervision) yapar; cvflair kamera
6
+ döngüsünü ve tema ayarlarını üstlenir. Model bağımsızdır: `supervision`'ın `Detections`
7
+ nesnesini üreten her kaynak (YOLO, MediaPipe, InsightFace veya özel bir model) tema
8
+ tarafından çizilebilir.
9
+
10
+ ![cvflair demo](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/demo.gif)
11
+
12
+ *Aynı tespitler, üç tema. Animasyon `tools/make_demo_gif.py` ile üretildi — sentetik
13
+ sahne, kamera gerekmiyor.*
14
+
15
+ > **Durum:** Faz 1 tamam (kamera döngüsü, üç tema, testler), Faz 2 başladı (model
16
+ > bağlama). Paket henüz PyPI'da yayınlanmadı.
17
+
18
+ ## Kurulum
19
+
20
+ Python 3.10 veya üzeri gerekir (bu alt sınır `supervision`'dan geliyor).
21
+
22
+ ```bash
23
+ git clone https://github.com/kbycode/cvflair.git
24
+ cd cvflair
25
+ pip install -e .
26
+ ```
27
+
28
+ Yayınlandıktan sonra: `pip install cvflair`
29
+
30
+ YOLO ile kullanmak için Ultralytics extra'sı: `pip install -e ".[yolo]"`
31
+ (ayrıntı ve lisans notu için aşağıdaki [Lisans](#lisans) bölümü).
32
+
33
+ ## Hızlı başlangıç
34
+
35
+ ```python
36
+ from cvflair import Camera
37
+
38
+ cam = Camera(source=0, theme="neon")
39
+ for frame in cam.stream():
40
+ cam.show(frame)
41
+ ```
42
+
43
+ Kamera açılır, kareler ayrı bir thread'de okunur, pencere `q` veya ESC ile kapanır —
44
+ `release()` çağırmaya, `while True` kurmaya gerek yok.
45
+
46
+ > Model verilmeyen bu akışta ekranda ham kare görünür: tema ancak ortada tespit
47
+ > varken çizim yapar. Temayı modelsiz, canlı görmek için:
48
+ > `python examples/demo_fake_detections.py` — kamera görüntüsü üzerine hareketli sahte
49
+ > kutular çizer ve temaları 3 saniyede bir değiştirir.
50
+
51
+ ## Modelle kullanım
52
+
53
+ `stream()`'e bir model verildiğinde her adım `(kare, tespitler)` çifti döndürür ve
54
+ tema otomatik uygulanır:
55
+
56
+ ```python
57
+ from cvflair import Camera
58
+
59
+ cam = Camera(source=0, theme="neon")
60
+ for frame, detections in cam.stream(model="yolov8n.pt"):
61
+ cam.show(frame, detections)
62
+ ```
63
+
64
+ `model` üç şeyden biri olabilir:
65
+
66
+ | Değer | Anlamı |
67
+ |---|---|
68
+ | `"yolov8n.pt"` (ağırlık yolu) | Ultralytics ile yüklenir — `cvflair[yolo]` gerekir |
69
+ | Hazır bir Ultralytics modeli | `YOLO(...)` nesnesi doğrudan verilebilir, çıktısı dönüştürülür |
70
+ | Herhangi bir çağrılabilir | `sv.Detections` döndüren kendi fonksiyonun — MediaPipe, InsightFace, özel model |
71
+
72
+ Son seçenek kütüphaneyi model-agnostik yapan yer:
73
+
74
+ ```python
75
+ import supervision as sv
76
+ from cvflair import Camera
77
+
78
+ def detect(frame) -> sv.Detections:
79
+ ... # kendi modelin
80
+ return sv.Detections(xyxy=..., class_id=..., confidence=...)
81
+
82
+ cam = Camera(source=0, theme="pastel")
83
+ for frame, detections in cam.stream(model=detect):
84
+ cam.show(frame, detections)
85
+ ```
86
+
87
+ Çıkarım bu döngüde çalışır, okuma thread'inde değil: bir kare işlenirken okuyucu
88
+ kuyruktaki kareyi tazelemeye devam eder, dolayısıyla bir sonraki tur birikmiş
89
+ kareyle değil en güncel kareyle başlar.
90
+
91
+ Ultralytics'e ek ayar geçirmek için `UltralyticsDetector` doğrudan kullanılabilir:
92
+
93
+ ```python
94
+ from cvflair import Camera, UltralyticsDetector
95
+ from ultralytics import YOLO
96
+
97
+ detector = UltralyticsDetector(YOLO("yolov8n.pt"), conf=0.4, device="cpu", classes=[0])
98
+ cam = Camera(source=0, theme="neon")
99
+ for frame, detections in cam.stream(model=detector):
100
+ cam.show(frame, detections)
101
+ ```
102
+
103
+ Etiket metni doğrudan da verilebilir: `cam.show(frame, detections, labels=[...])`.
104
+ Pencere yönetimi uygulamaya aitse `cam.annotate(frame, detections)` yalnızca çizim yapar.
105
+
106
+ ## Temalar
107
+
108
+ | Tema | Görünüm | |
109
+ |---|---|---|
110
+ | `minimal` | ince beyaz çerçeve, sade etiket — ekran kaydı ve profesyonel demo için | ![minimal](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-minimal.png) |
111
+ | `neon` | sınıf başına canlı renk, yuvarlak köşe, koyu hâle ile parlama hissi | ![neon](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-neon.png) |
112
+ | `pastel` | yumuşak tonlar, geniş yuvarlama, koyu etiket yazısı — atölye/projeksiyon | ![pastel](https://raw.githubusercontent.com/kbycode/cvflair/main/docs/theme-pastel.png) |
113
+
114
+ Yol haritasındaki `cyberpunk` ve `hud` temaları Faz 2'de gelecek.
115
+
116
+ Özel bir tema, `Theme` doğrudan kurulup `Camera`'ya verilerek tanımlanır:
117
+
118
+ ```python
119
+ import supervision as sv
120
+ from cvflair import Camera, Theme
121
+
122
+ my_theme = Theme(
123
+ name="my-theme",
124
+ palette=sv.ColorPalette.from_hex(["#39FF14", "#FF00E5"]),
125
+ box_style="corner", # "box" | "round" | "corner"
126
+ thickness=2,
127
+ glow=True,
128
+ text_scale=0.6,
129
+ )
130
+ cam = Camera(source=0, theme=my_theme)
131
+ ```
132
+
133
+ Temaları görmenin iki yolu:
134
+
135
+ ```bash
136
+ python examples/demo_fake_detections.py # canlı kamera + hareketli sahte tespitler
137
+ python examples/theme_preview.py # kamerasız, her temayı bir PNG'ye çizer
138
+ ```
139
+
140
+ ## API özeti
141
+
142
+ | Üye | Ne yapar |
143
+ |---|---|
144
+ | `Camera(source, theme, width, height, fps, window_name, capture_factory)` | Kaynağı ve temayı bağlar; kamerayı henüz açmaz |
145
+ | `cam.start()` / `cam.close()` | Cihazı açar ve okuma thread'ini başlatır / her şeyi bırakır |
146
+ | `cam.stream(timeout, model=None)` | Kareleri üretir; model verilirse `(kare, tespitler)` çifti. İlk kullanımda `start()`, bitince `close()` eder |
147
+ | `cam.read(timeout)` | En güncel tek kareyi döndürür, kaynak bittiyse `None` |
148
+ | `cam.show(frame, detections, labels)` | Temayı uygular, pencerede gösterir; çıkış istendiğinde `False` döner |
149
+ | `cam.annotate(frame, detections, labels)` | Sadece çizer, pencere açmaz |
150
+ | `cam.theme` | Okunur/yazılır; `cam.theme = "minimal"` çalışır |
151
+ | `cam.frames_read` / `cam.frames_dropped` | Okunan ve tüketici yetişemediği için atılan kare sayısı |
152
+ | `get_theme(ad)` / `available_themes()` | Tema adını çözer / mevcut adları listeler |
153
+ | `UltralyticsDetector(model, **kwargs)` | Ultralytics çıktısını `sv.Detections`'a çevirir; `conf`, `iou`, `device` gibi ayarları taşır |
154
+ | `resolve_detector(model)` | Ağırlık yolu / model / çağrılabilir → detektör; `stream()` bunu kullanır |
155
+
156
+ `Camera` bağlam yöneticisi olarak da kullanılabilir: `with Camera() as cam: ...`
157
+
158
+ ## Nasıl çalışıyor
159
+
160
+ - **Kareler ayrı thread'de okunur.** Okuyucu, tüketiciyi beklemez.
161
+ - **Kuyruk tek slotlu.** Yeni kare gelince bekleyen eski kare düşürülür
162
+ (`frames_dropped` ile sayılır). Böylece işleme yavaşladığında gecikme birikmez;
163
+ ekranda hep en güncel kare olur.
164
+ - **Annotator'lar bir kere kurulur.** `Theme` nesnesi oluşturulurken `supervision`
165
+ annotator'ları hazırlanır ve her karede yeniden kullanılır — döngü içinde annotator
166
+ kurmak bu tür işlerde en sık görülen gereksiz maliyettir.
167
+ - **Çizim matematiği yeniden yazılmadı.** Her piksel `supervision` tarafından çiziliyor;
168
+ cvflair sadece yapılandırma ve akış katmanı.
169
+ - **Model paketin dışında.** `stream(model=...)` verilen şeyi bir çağrılabilire çevirir;
170
+ ağırlıklar ilk yinelemede yüklenir. Hiçbir model kodu veya ağırlığı pakete gömülü değil.
171
+
172
+ ## Geliştirme
173
+
174
+ ```bash
175
+ python -m venv .venv
176
+ .venv\Scripts\activate
177
+ pip install -e ".[dev]"
178
+ pytest
179
+ ruff check .
180
+ ```
181
+
182
+ Testler kamera gerektirmez: `Camera`'ya `capture_factory` üzerinden sahte bir
183
+ `VideoCapture` verilir, temalar da sentetik kareler üzerinde doğrulanır.
184
+
185
+ Dokümantasyon görselleri de kamerasız üretilir:
186
+
187
+ ```bash
188
+ python tools/make_demo_gif.py # docs/demo.gif
189
+ python examples/theme_preview.py # examples/output/theme-*.png
190
+ ```
191
+
192
+ ## Yol haritası
193
+
194
+ | Faz | İçerik | Durum |
195
+ |---|---|---|
196
+ | Faz 1 | Kamera döngüsü, `minimal`/`neon`/`pastel` temaları, README, demo GIF, testler | tamam |
197
+ | Faz 2 | Model bağlama (`stream(model=...)`) | tamam |
198
+ | Faz 2 | PyPI paketi, Türkçe dokümantasyon sitesi, tema playground, `cyberpunk`/`hud` | sırada |
199
+ | Faz 3 | GitHub Actions (lint + test), issue şablonları, örnek galerisi | planlandı |
200
+
201
+ ## Lisans
202
+
203
+ MIT — bkz. [LICENSE](LICENSE). Bağımlılıkların hepsi izin verici lisanslı
204
+ (`supervision` MIT, `opencv-python` Apache 2.0, `numpy` BSD).
205
+
206
+ YOLO ağırlıkları veya Ultralytics kodu bu pakete gömülü değildir; Ultralytics'in
207
+ kullanılması hâlinde AGPL-3.0 koşulları onu kullanan projenin sorumluluğundadır.
@@ -0,0 +1,80 @@
1
+ """
2
+ Modelsiz canlı demo: kamera görüntüsü üzerine hareketli sahte tespitler çizer.
3
+
4
+ Faz 1'de model bağlama yok; bu betik tespitlerin yerine hareket eden kutular
5
+ üreterek temayı canlı gösterir. Temalar birkaç saniyede bir sırayla değişir.
6
+
7
+ Çalıştırmak için: python examples/demo_fake_detections.py
8
+ Çıkmak için: pencere seçiliyken 'q' veya ESC
9
+ """
10
+
11
+ import math
12
+ import time
13
+
14
+ import numpy as np
15
+ import supervision as sv
16
+
17
+ from cvflair import Camera, available_themes
18
+
19
+ #: Kaç saniyede bir sıradaki temaya geçileceği. Kare sayısı yerine süre
20
+ #: kullanılıyor, çünkü kare hızı cihaza göre değişiyor.
21
+ THEME_SWITCH_SECONDS = 3.0
22
+
23
+ CLASS_NAMES = ("kutu", "hedef")
24
+
25
+
26
+ def _pulse(tick: int, period: int, low: float, high: float) -> float:
27
+ """(low, high) aralığında ileri geri salınan bir değer."""
28
+ phase = (math.sin(2 * math.pi * tick / period) + 1) / 2
29
+ return low + (high - low) * phase
30
+
31
+
32
+ def fake_detections(width: int, height: int, tick: int) -> sv.Detections:
33
+ """İki kutu: biri yatay, diğeri dikey salınıyor."""
34
+ box_w, box_h = width * 0.26, height * 0.42
35
+ left = _pulse(tick, 140, 0.04, 0.42) * width
36
+ top = height * 0.18
37
+
38
+ small_w, small_h = width * 0.20, height * 0.28
39
+ small_left = width * 0.62
40
+ small_top = _pulse(tick, 100, 0.10, 0.55) * height
41
+
42
+ return sv.Detections(
43
+ xyxy=np.array(
44
+ [
45
+ [left, top, left + box_w, top + box_h],
46
+ [small_left, small_top, small_left + small_w, small_top + small_h],
47
+ ],
48
+ dtype=np.float32,
49
+ ),
50
+ class_id=np.array([0, 1]),
51
+ confidence=np.array(
52
+ [_pulse(tick, 70, 0.55, 0.99), _pulse(tick, 55, 0.40, 0.95)], dtype=np.float32
53
+ ),
54
+ )
55
+
56
+
57
+ def main() -> None:
58
+ themes = available_themes()
59
+ print(f"Temalar sırayla: {', '.join(themes)} — çıkmak için 'q' veya ESC")
60
+
61
+ cam = Camera(source=0, theme=themes[0])
62
+ started = time.monotonic()
63
+ for tick, frame in enumerate(cam.stream()):
64
+ elapsed = time.monotonic() - started
65
+ wanted = themes[int(elapsed // THEME_SWITCH_SECONDS) % len(themes)]
66
+ if wanted != cam.theme.name:
67
+ # Tema atamak annotator'ları yeniden kurar; sadece ad değişince yapılıyor.
68
+ cam.theme = wanted
69
+
70
+ height, width = frame.shape[:2]
71
+ detections = fake_detections(width, height, tick)
72
+ labels = [
73
+ f"{name} {confidence:.2f}"
74
+ for name, confidence in zip(CLASS_NAMES, detections.confidence, strict=True)
75
+ ]
76
+ cam.show(frame, detections, labels=labels)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ main()
@@ -0,0 +1,16 @@
1
+ """
2
+ Üç satırlık başlangıç: kamerayı aç, kareleri neon temasıyla göster.
3
+
4
+ Tespit verilmediği için ekranda ham kare görünür — tema yalnızca `show()`'a bir
5
+ `Detections` geldiğinde çizim yapar. Temayı modelsiz görmek için:
6
+ examples/demo_fake_detections.py
7
+
8
+ Çalıştırmak için: python examples/quickstart.py
9
+ Çıkmak için: pencere seçiliyken 'q' veya ESC
10
+ """
11
+
12
+ from cvflair import Camera
13
+
14
+ cam = Camera(source=0, theme="neon")
15
+ for frame in cam.stream():
16
+ cam.show(frame)
@@ -0,0 +1,45 @@
1
+ """
2
+ Kamerasız tema önizlemesi: sahte tespitlerle her temayı bir PNG'ye çizer.
3
+
4
+ Çalıştırmak için: python examples/theme_preview.py
5
+ Çıktı: examples/output/theme-<ad>.png
6
+ """
7
+
8
+ from pathlib import Path
9
+
10
+ import cv2
11
+ import numpy as np
12
+ import supervision as sv
13
+
14
+ from cvflair import available_themes, get_theme
15
+
16
+ OUTPUT_DIR = Path(__file__).parent / "output"
17
+
18
+ # Tespit üreten bir model yerine sabit kutular: amaç temanın görünümü.
19
+ DETECTIONS = sv.Detections(
20
+ xyxy=np.array(
21
+ [[60, 90, 300, 380], [340, 140, 560, 330], [600, 60, 760, 260]], dtype=np.float32
22
+ ),
23
+ class_id=np.array([0, 1, 2]),
24
+ confidence=np.array([0.94, 0.81, 0.66], dtype=np.float32),
25
+ )
26
+ LABELS = ["kisi 0.94", "bisiklet 0.81", "kopek 0.66"]
27
+
28
+
29
+ def backdrop(width: int = 840, height: int = 460) -> np.ndarray:
30
+ """Koyu gri, hafif degradeli bir zemin — kutuların kontrastını görmek için."""
31
+ column = np.linspace(28, 58, width, dtype=np.uint8)
32
+ return np.repeat(column[None, :, None], height, axis=0).repeat(3, axis=2)
33
+
34
+
35
+ def main() -> None:
36
+ OUTPUT_DIR.mkdir(exist_ok=True)
37
+ for name in available_themes():
38
+ frame = get_theme(name).annotate(backdrop(), DETECTIONS, labels=LABELS)
39
+ path = OUTPUT_DIR / f"theme-{name}.png"
40
+ cv2.imwrite(str(path), frame)
41
+ print(f"{name:>8} -> {path}")
42
+
43
+
44
+ if __name__ == "__main__":
45
+ main()
@@ -0,0 +1,21 @@
1
+ """
2
+ YOLO ile üç satırlık akış.
3
+
4
+ Gereken: pip install "cvflair[yolo]"
5
+ Ağırlık dosyası ilk çalıştırmada Ultralytics tarafından indirilir.
6
+ Ultralytics AGPL-3.0 lisanslıdır; cvflair'in zorunlu bağımlılığı değildir.
7
+
8
+ Etiketler sınıf adlarından gelir (supervision dönüşümü class_name alanını doldurur).
9
+ Güven skorunu da yazdırmak için:
10
+ labels = [f"{n} {c:.2f}" for n, c in zip(detections["class_name"], detections.confidence)]
11
+ cam.show(frame, detections, labels=labels)
12
+
13
+ Çalıştırmak için: python examples/yolo_quickstart.py
14
+ Çıkmak için: pencere seçiliyken 'q' veya ESC
15
+ """
16
+
17
+ from cvflair import Camera
18
+
19
+ cam = Camera(source=0, theme="neon")
20
+ for frame, detections in cam.stream(model="yolov8n.pt"):
21
+ cam.show(frame, detections)