fullseye

Erste Schritte (in 5 Minuten startklar)

日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch

Welcher Einstieg passt zu Ihnen (3 Einstiegspunkte)

Fullseye ist breit angelegt — wenn man nicht zuerst entscheidet, “was man als Erstes öffnet”, bleibt man stecken. Was hier aufgeführt ist, sind keine neu geschriebenen Demos, sondern Beispiele, die bereits jedes Mal von einem Gate ausgeführt werden (schlägt eines fehl, wird die CI rot).

Einstieg Zielgruppe 5 Min: erst mal laufen lassen 30 Min: dem Inneren folgen Halber Tag: mit eigenen Daten
Erklärbare Sichtprüfung Prüfung · Qualitätssicherung py -3.11 examples/poc_solder_fillet_aoi.py — AOI für Lötstellen (Fillet) py -3.11 examples/poc_fabric_defect.py — verpasste und falsche Treffer getrennt gezählt CAPABILITIES.md, Abschnitt “Finden” → in Studio mit eigenen Bildern
3-D für Robotik Robotik · 3-D-Messung py -3.11 examples/perception_pipeline.py — Stereo → Tiefe → Punktwolke → Begehbarkeit py -3.11 examples/grasp_pose.py — Punktwolke auf ein Modell ausgerichtet, 6-DoF-Pose und Greifrichtung EXAMPLES_3D.md → eigene Punktwolken/Meshes einspeisen
Physikbasierte zerstörungsfreie Prüfung Röntgen · Optik · Messtechnik py -3.11 examples/ct_reconstruction.py — Projektion → Rekonstruktion → Abmessung in mm und Fehleranzahl py -3.11 examples/poc_ct_void_morphology.py — warum eine einzelne Pass/Fail-Zahl blind für die Form ist CAPABILITIES.md, Abschnitt “Formgebung” → mit eigenen Volumendaten

Jedes Beispiel besitzt einen Referenzwert (Ground Truth) (geschlossene Lösung oder synthetische Daten). Der Nullpunkt (Ergebnis bei Untätigkeit) wird immer mit angegeben, sodass Sie selbst prüfen können, ob etwas wirklich “gewirkt” hat. Wie weit die Validierung jeweils reicht, steht im Verzeichnis MATURITY.md — nicht von Hand geschrieben, sondern automatisch aus den tatsächlich laufenden Gates und dem Vorhandensein echter Daten ermittelt.


Dies ist die Anleitung, um Fullseye (Arbeitsname imgevolve) auf dem kürzesten Weg zum Laufen zu bringen. In der Reihenfolge Installation → erste Pipeline bauen → ausführen → Ergebnis ansehen geht es einen Weg ohne Stolperfallen. Eine ausführlichere Einrichtung findet sich in INSTALL.md, sämtliche Funktionen von Studio in STUDIO_GUIDE.md, die Ausführung aus eigenem Code in ENGINE.md.

Fullseye ist eine Bildverarbeitungs-Operatorbibliothek, die numpy-Arrays als Ein- und Ausgabe verwendet, auf der eine visuelle Pipeline-Entwurfsumgebung im Stil von HDevelop (Fullseye Studio) sowie eine Ausführungs-Laufzeitumgebung (FullseyeEngine) aufsetzen. In der Sprache von HALCON/HDevelop entspricht das dem zweistufigen Aufbau “in HDevelop den Ablauf entwerfen, in HDevEngine aus der eigenen Anwendung heraus aufrufen” — unverändert mit Python + numpy nachgebildet.


1. Installation (1 Minute)

Voraussetzung: Python 3.11 (unter Windows py -3.11, unter Linux python3.11).

cd <path-to-fullseye>
py -3.11 -m pip install -e .          # nur der Kern aus numpy + scipy (rund 885 Operatoren)

Der Kern läuft allein mit numpy und scipy. Zusätzliche Backends wie OpenCV / scikit-image / Pillow sind optional; fehlen sie, werden lediglich die für dieses Backend spezifischen Operatoren deaktiviert (graceful degradation). In der Praxis braucht man mindestens OpenCV oder Pillow zum Lesen/Schreiben von Bilddateien — es lohnt sich also, eines der folgenden zusätzlich zu installieren.

py -3.11 -m pip install -e ".[opencv]"    # Bild-I/O + Operatoren auf Basis von OpenCV
py -3.11 -m pip install -e ".[all]"       # alle Backends (opencv, skimage, pil, wavelets, gpu, extra)
py -3.11 -m pip install -e ".[gui]"       # falls Fullseye Studio (PySide6) genutzt werden soll

Die Liste der Extras samt Bedeutung ist in INSTALL.md zusammengefasst. Für die GUI wird [gui] (oder [all] + [gui]) benötigt.

Man kann es auch ohne Installation ausprobieren. Setzen Sie das Repository-Wurzelverzeichnis (<path-to-fullseye>) als Arbeitsverzeichnis und tragen Sie diesen Pfad in die Umgebungsvariable PYTHONPATH ein — dann funktioniert import fullseye. Die Befehle fullseye / fullseye-studio (Konsolen-Skripte) stehen allerdings erst nach einem Durchlauf von pip install -e . zur Verfügung.


2. Zunächst einen einzelnen Operator ausführen (Python)

import fullseye, numpy as np

frame = np.clip(np.random.default_rng(0).random((64, 64)), 0, 1)   # gray H×W in [0,1]

edges = fullseye.apply(frame, "sobel_amp")     # image → image (Gradientenstärke)
seg   = fullseye.apply(frame, "otsu")          # image → region (0/1-Binärbild)
n     = fullseye.apply(seg,   "count_obj")     # region → feature (Objektanzahl = Python float)
print(n)                                       # z. B.: 316.0

Die Argumentreihenfolge lautet apply(image, name, a, b) — das erste Argument ist das Array, das zweite der Operatorname. Vertauscht man sie, bricht der Aufruf ab 0.1.9 mit TypeError: ... arguments look swapped ab (bis einschließlich 0.1.8 erschien stattdessen der unzusammenhängende numpy-Fehler “truth value of an array is ambiguous”). a/b müssen endliche Werte im Bereich 0..1 sein. Strings, None und NaN lösen sofort TypeError/ValueError aus; Werte außerhalb des Bereichs werden abgeschnitten und im Verzeichnis protokolliert.

Welche Operatoren es gibt, lässt sich so herausfinden:

fullseye.op_names()                 # alle registrierten Operatornamen (860 Stück, Stand 2026-09-03)
fullseye.list_ops(search="edge")    # Teilstring-Suche über Name / HALCON-Name / Kategorie
fullseye.list_ops(sort="region")    # Filterung nach Eingabe-sort
fullseye.categories()               # 47 Kategorien

3. Eine Pipeline aufbauen (mehrere Operatoren verketten)

Mehrere Operatoren nacheinander zu durchlaufen ergibt eine “Pipeline”. Das Array wird durch jede Stufe hindurchgereicht, das Endergebnis wird zurückgegeben.

# Alle Stufen verwenden dieselben a, b (dieselbe Form wie in der CLI)
out = fullseye.run_pipeline(frame, ["gaussian", "sobel_amp", "otsu"])

# Wenn jede Stufe eigene Regler haben soll (mit Tupeln (name, a, b) angeben)
out = fullseye.run_pipeline(frame, [("gaussian", 0.3, 0.5), ("otsu", 0.4, 0.5)])

Das ist “Smoothing (Glättung) → Kantenstärke → Otsu-Binarisierung”, ein typisches Beispiel dafür, wie aus einem Bild eine binäre Kantenkarte erzeugt wird. 20 sofort einsatzbereite Kombinationen (Rezepte) sind bereits mitgeliefert.

import recipes
recipes.names()                                   # Liste der Rezeptnamen
stages = recipes.stages("Edge — Sobel + Otsu")    # [(op, a, b), ...]
out = fullseye.run_pipeline(frame, stages)

4. Visuell aufbauen (Fullseye Studio)

Ohne eine Zeile Code zu schreiben: Operatoren suchen und anordnen, Regler per Schieberegler drehen, Stufe für Stufe ausführen und die Zwischenergebnisse direkt betrachten. Dafür werden die GUI-Extras benötigt (pip install -e ".[gui]" = PySide6).

py -3.11 studio.py          # oder, falls installiert: fullseye-studio

Der Aufbau besteht aus 3 Bereichen.

Die aufgebaute Pipeline lässt sich mit Export (Strg+E) als --ops-String oder als Python-Code exportieren und mit Save pipeline (Strg+Umschalt+S) als JSON speichern. Sämtliche Funktionen und Tastenkürzel finden sich in STUDIO_GUIDE.md, innerhalb der Anwendung zeigt F1 eine Übersicht.


5. Eine gespeicherte Pipeline ausführen (CLI / Code)

Das in Studio per Save pipeline erzeugte JSON (oder ein --ops-String) lässt sich unverändert auf eine Datei anwenden. Das ist der zu HDevEngine äquivalente Weg, “das Entworfene auszuführen, ohne es neu zu schreiben”.

# I/O und Stufen des gespeicherten JSON prüfen (Strukturprüfung ohne Bild)
py -3.11 imgevolve.py run edge.json --describe

# Auf ein Bild anwenden und das Ergebnis speichern
py -3.11 imgevolve.py run edge.json in.png --out result.png

# Ergebnisse stufenweise speichern (result_00.png, result_01.png, ...)
py -3.11 imgevolve.py run edge.json in.png --stepwise --out step.png

# Die Pipeline als eigenständige Python-Funktion exportieren
py -3.11 imgevolve.py run "gaussian,sobel_amp,otsu" --to-python

Zur Ausführung aus Code wird FullseyeEngine verwendet (Details in ENGINE.md).

import fullseye
eng = fullseye.FullseyeEngine.load("edge.json")     # or .from_ops("gaussian,sobel_amp,otsu")
print(eng.input_sort(), "->", eng.output_sort())    # image -> region
out = eng.run(frame)                                # numpy in, numpy out
steps = eng.run_stepwise(frame)                     # Zwischenergebnisse jeder Stufe (Liste)

6. Einzeln per CLI anwenden

Wenn man Bilddateien direkt bearbeiten möchte, ist die CLI die bequemste Wahl (für Bild-I/O werden OpenCV oder Pillow benötigt).

py -3.11 imgevolve.py ops --search edge                    # Operatoren durchsuchen
py -3.11 imgevolve.py has gauss_filter                      # prüfen, ob der HALCON-Name implementiert ist + Aufrufform
py -3.11 imgevolve.py apply gauss_filter in.png out.png --a 0.6
py -3.11 imgevolve.py pipeline in.png out.png --ops "gaussian,sobel_amp,otsu"

apply / pipeline verwenden in jeder Stufe dieselben --a / --b. Wenn jede Stufe eigene Regler benötigt, verwenden Sie stattdessen run_pipeline (Python) oder Studio, wie oben beschrieben.


Wenn es hakt

Symptom Abhilfe
ModuleNotFoundError: No module named 'fullseye' pip install -e . ausführen oder das Repository-Wurzelverzeichnis in PYTHONPATH eintragen
Kein Befehl fullseye / fullseye-studio vorhanden Die Konsolen-Skripte werden erst durch pip install -e . registriert. Ohne Installation py -3.11 imgevolve.py ... bzw. py -3.11 studio.py verwenden
Studio startet nicht GUI-Extras nicht installiert. pip install -e ".[gui]" (PySide6)
apply / pipeline meldet cannot read ... Für Bild-I/O OpenCV ([opencv]) oder Pillow ([pil]) installieren
Operatoren eines zusätzlichen Backends erscheinen als “unknown” Das betreffende Backend ist nicht installiert. .[skimage], .[wavelets], .[extra] usw. ergänzen

Eine ausführlichere Fehlersuche findet sich in INSTALL.md.

Weiterführende Lektüre