Skip to main content

cvflair

PyPI CI Python 3.10+ İndirme License: MIT

Bilgisayarlı görü tespitlerini üç satırda, hazır temalarla ekrana çizen ince bir katman.

Kamera döngüsü, temalar ve çizim tek pakette; numpy ve opencv dışında bağımlılığı yok. Model bağımsızdır: kutu üreten her kaynak (YOLO, MediaPipe, InsightFace veya özel bir model) aynı temayla çizilir.

cvflair demo

Aynı tespitler, dört tema. tools/make_demo_gif.py ile üretildi: docs/city.png üzerine çizilen kutular. Başka bir görsel için --background <yol>.

Sekiz çerçeve biçimi, dört hazır tema — hepsi tek Theme(...) satırıyla. Hiçbirini kurmadan denemek için: tema playground → Ayarları oynat, hazır Python kodunu kopyala; sayfa tamamen tarayıcıda çalışır.

çerçeve biçimleri

Kurulum

Python 3.10 veya üzeri gerekir.

pip install cvflair

YOLO ile kullanmak için Ultralytics extra'sı — ayrıntı ve lisans notu için aşağıdaki Lisans bölümü:

pip install "cvflair[yolo]"

Depodan geliştirme kurulumu:

git clone https://github.com/kbycode/cvflair.git
cd cvflair
pip install -e ".[dev]"

Hızlı başlangıç

from cvflair import Camera

cam = Camera(source=0, theme="neon")
for frame in cam.stream():
    cam.show(frame)

Kamera açılır, kareler ayrı bir thread'de okunur, pencere q veya ESC ile kapanır — release() çağırmaya, while True kurmaya gerek yok.

Model verilmeyen bu akışta ekranda ham kare görünür: tema ancak ortada tespit varken çizim yapar. Temayı modelsiz, canlı görmek için: python examples/demo_fake_detections.py — kamera görüntüsü üzerine hareketli sahte kutular çizer ve temaları 3 saniyede bir değiştirir.

Modelle kullanım

stream()'e bir model verildiğinde her adım (kare, tespitler) çifti döndürür ve tema otomatik uygulanır:

from cvflair import Camera

cam = Camera(source=0, theme="neon")
for frame, detections in cam.stream(model="yolov8n.pt"):
    cam.show(frame, detections)

model üç şeyden biri olabilir:

Değer Anlamı
"yolov8n.pt" (ağırlık yolu) Ultralytics ile yüklenir — cvflair[yolo] gerekir
Hazır bir Ultralytics modeli YOLO(...) nesnesi doğrudan verilebilir, çıktısı dönüştürülür
Herhangi bir çağrılabilir Kutu döndüren herhangi bir fonksiyon — MediaPipe, InsightFace, özel model

Son seçenek kütüphaneyi model-agnostik yapan yer:

from cvflair import Camera, Detections

def detect(frame) -> Detections:
    ...  # özel model çağrısı
    return Detections(xyxy=[[10, 20, 120, 260]], class_id=[0], names=["kisi"])

cam = Camera(source=0, theme="pastel")
for frame, detections in cam.stream(model=detect):
    cam.show(frame, detections)

Çizim alan adlarına göre okuduğu için başka kütüphanelerin tespit nesneleri de (örneğin supervision.Detections) dönüştürülmeden verilebilir.

Çıkarım bu döngüde çalışır, okuma thread'inde değil: bir kare işlenirken okuyucu kuyruktaki kareyi tazelemeye devam eder, dolayısıyla bir sonraki tur birikmiş kareyle değil en güncel kareyle başlar.

Ultralytics'e ek ayar geçirmek için UltralyticsDetector doğrudan kullanılabilir:

from cvflair import Camera, UltralyticsDetector
from ultralytics import YOLO

detector = UltralyticsDetector(YOLO("yolov8n.pt"), conf=0.4, device="cpu", classes=[0])
cam = Camera(source=0, theme="neon")
for frame, detections in cam.stream(model=detector):
    cam.show(frame, detections)

Etiket metni doğrudan da verilebilir: cam.show(frame, detections, labels=[...]). Pencere yönetimi uygulamaya aitse cam.annotate(frame, detections) yalnızca çizim yapar.

Temalar

Tema Görünüm
minimal ince beyaz çerçeve, sade etiket — ekran kaydı ve profesyonel demo için minimal
neon sınıf başına canlı renk, yuvarlak köşe, koyu hâle ile parlama hissi neon
pastel yumuşak tonlar, geniş yuvarlama, koyu etiket yazısı — atölye/projeksiyon pastel
cyberpunk ince çerçeve + kalın beyaz köşeler, yüksek kontrast — hedef kilitleme görünümü cyberpunk
hud ince köşe çentikleri + köşede sayaç paneli — oyun ve robotik demoları hud

Çerçeve biçimleri

Görselleri yukarıda. box_style sekiz değerden birini alır:

Değer Görünüm Ayarları
box düz dikdörtgen thickness
round yuvarlak köşeli dikdörtgen roundness
corner yalnızca köşe çentikleri corner_length
dashed kesikli çerçeve dash_length, gap_length
dashed_corner kesikli çerçevenin üstüne dolu köşe ayraçları (kesikli + köşe karışımı) corner_length, dash_length, gap_length
bracket yuvarlak dirsekli köşe ayracı (köşe + yuvarlak karışımı) corner_length, roundness
crosshair kenar ortası çentikleri + merkez artısı arm_length, center_size
target ince çerçeve + kalın köşeler corner_length, edge_thickness

Hepsi cvflair.annotators içinde, OpenCV çizim çağrılarıyla tanımlıdır; renk paleti ve ColorLookup davranışı sekizinde de aynıdır.

dashed_corner, bracket, crosshair ve target ikinci bir renk kabul eder; köşe ayraçları, dirsekler ve merkez artısı o renge geçer — hibrit biçimlerin iki katmanı böyle ayrışır:

theme = Theme(
    palette=["#00F0FF"],
    accent_palette="#FF206E",
    box_style="target",
    thickness=3,
)

Sayaç paneli

hud teması köşeye küçük bir panel çizer. Sayılar kutulardan değil döngüden gelir, bu yüzden ayrı bir yoldan veriliyor — Camera kare hızını ve tespit sayısını kendisi dolduruyor:

cam = Camera(source=0, theme="hud")
for frame, detections in cam.stream(model="yolov8n.pt"):
    cam.show(frame, detections)          # FPS ve Objects panelde

Kendi satırlarını eklemek için stats; aynı anahtar verilirse seninki kazanır:

cam.show(frame, detections, stats={"Skor": score, "Tur": lap})

Panel her temaya açılabilir: Theme(hud=True, hud_position="bottom_right", hud_opacity=0.5). Konumlar cvflair.HUD_POSITIONS içinde. Ölçülen kare hızına cam.measured_fps ile doğrudan da erişilebilir — cihazdan istenen fps değil, döngünün gerçekte ulaştığı hız.

Özel bir tema, Theme doğrudan kurulup Camera'ya verilerek tanımlanır:

from cvflair import Camera, Theme

my_theme = Theme(
    name="my-theme",
    palette=["#39FF14", "#FF00E5"],
    box_style="corner",     # bkz. Çerçeve biçimleri
    thickness=2,
    glow=True,
    text_scale=0.6,
)
cam = Camera(source=0, theme=my_theme)

Ayarları tarayıcıda deneyip hazır Theme(...) kodunu kopyalamak için: tema playground — kurulum gerektirmez, tamamen istemci tarafında çalışır, ayarlar bağlantıda taşınır.

Temaları yerelde görmenin iki yolu:

python examples/demo_fake_detections.py   # canlı kamera + hareketli sahte tespitler
python examples/theme_preview.py          # kamerasız, her temayı bir PNG'ye çizer

API özeti

Üye Ne yapar
Camera(source, theme, width, height, fps, window_name, capture_factory) Kaynağı ve temayı bağlar; kamerayı henüz açmaz
cam.start() / cam.close() Cihazı açar ve okuma thread'ini başlatır / her şeyi bırakır
cam.stream(timeout, model=None) Kareleri üretir; model verilirse (kare, tespitler) çifti. İlk kullanımda start(), bitince close() eder
cam.read(timeout) En güncel tek kareyi döndürür, kaynak bittiyse None
cam.show(frame, detections, labels, stats) Temayı uygular, pencerede gösterir; çıkış istendiğinde False döner
cam.annotate(frame, detections, labels) Sadece çizer, pencere açmaz
cam.theme Okunur/yazılır; cam.theme = "minimal" çalışır
cam.frames_read / cam.frames_dropped Okunan ve tüketici yetişemediği için atılan kare sayısı
cam.measured_fps Son 30 karenin ortalamasıyla ölçülen gerçek kare hızı
get_theme(ad) / available_themes() Tema adını çözer / mevcut adları listeler
Detections(xyxy, class_id, confidence, names, tracker_id) Kutu taşıyıcısı; from_ultralytics ve from_arrays yardımcılarıyla
UltralyticsDetector(model, **kwargs) Ultralytics çıktısını Detections'a çevirir; conf, iou, device gibi ayarları taşır
resolve_detector(model) Ağırlık yolu / model / çağrılabilir → detektör; stream() bunu kullanır

Camera bağlam yöneticisi olarak da kullanılabilir: with Camera() as cam: ...

Nasıl çalışıyor

  • Kareler ayrı thread'de okunur. Okuyucu, tüketiciyi beklemez.
  • Kuyruk tek slotlu. Yeni kare gelince bekleyen eski kare düşürülür (frames_dropped ile sayılır). Böylece işleme yavaşladığında gecikme birikmez; ekranda hep en güncel kare olur.
  • Annotator'lar bir kere kurulur. Theme nesnesi oluşturulurken çizim nesneleri hazırlanır ve her karede yeniden kullanılır — döngü içinde annotator kurmak bu tür işlerde en sık görülen gereksiz maliyettir.
  • Bağımlılık yüzeyi kasten dar. Yalnızca numpy ve opencv. import cvflair ~0.3 saniye sürüyor; kurulum ~170 MB (neredeyse tamamı opencv + numpy).
  • Model paketin dışında. stream(model=...) verilen şeyi bir çağrılabilire çevirir; ağırlıklar ilk yinelemede yüklenir. Hiçbir model kodu veya ağırlığı pakete gömülü değil.

Geliştirme

python -m venv .venv
.venv\Scripts\activate
pip install -e ".[dev]"
pytest
ruff check .

Testler kamera gerektirmez: Camera'ya capture_factory üzerinden sahte bir VideoCapture verilir, temalar da sentetik kareler üzerinde doğrulanır.

Dokümantasyon görselleri de kamerasız üretilir:

python tools/make_demo_gif.py    # docs/demo.gif
python examples/theme_preview.py # examples/output/theme-*.png

Lisans

MIT — bkz. LICENSE. Bağımlılıkların ikisi de izin verici lisanslı (opencv-python Apache 2.0, numpy BSD).

YOLO ağırlıkları veya Ultralytics kodu bu pakete gömülü değildir; Ultralytics'in kullanılması hâlinde AGPL-3.0 koşulları onu kullanan projenin sorumluluğundadır.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cvflair-0.5.0.tar.gz (46.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cvflair-0.5.0-py3-none-any.whl (26.0 kB view details)

Uploaded Python 3

File details

Details for the file cvflair-0.5.0.tar.gz.

File metadata

  • Download URL: cvflair-0.5.0.tar.gz
  • Upload date:
  • Size: 46.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.2

File hashes

Hashes for cvflair-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c0ecf7c9f86b69b8c58cc64ee1251967b4b1c8acc934c25184bcb9ec18fde85f
MD5 dd31f0a43c4761a2f75fd0e74c7036d7
BLAKE2b-256 9e5023bf62cbdb1a9336ec66b37a562ee3c08e6d444cf1d46d5ae124e90d0421

See more details on using hashes here.

File details

Details for the file cvflair-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: cvflair-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 26.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.2

File hashes

Hashes for cvflair-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9898d918f75f6a1e9a4af4d51ab5584d8edbaae2604b1b13e1d76315216a1c9f
MD5 f2fecc20b52ecb96e84a64a52ae5a047
BLAKE2b-256 ecec8b3e0814bb3165be3b0f26da846023125c3942ea06a21d679137b902b79d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page