OpenCV: der Werkzeugkasten
Die meistgenutzte Bibliothek der Bildverarbeitung: Installation, die wichtigsten dreißig Funktionen und die Fallen, in die jeder einmal tritt.
Die Idee
OpenCV ist eine Sammlung von rund 2.500 optimierten Funktionen für Bilder. Man benutzt selten mehr als dreißig davon, aber diese dreißig deckt fast jede praktische Aufgabe ab: laden, drehen, skalieren, weichzeichnen, Kanten finden, Formen zählen, Text erkennen, Video lesen.
Installation
pip install opencv-python numpyAuf einem Server ohne Bildschirm stattdessen opencv-python-headless. Beide
Pakete gleichzeitig zu installieren führt zu Abstürzen, die schwer zuzuordnen
sind.
Die dreißig Funktionen, die zählen
| Bereich | Funktionen |
|---|---|
| Ein und Aus | imread, imwrite, VideoCapture, imshow |
| Geometrie | resize, warpAffine, warpPerspective, rotate, flip |
| Farbe | cvtColor, inRange, split, merge |
| Filter | GaussianBlur, medianBlur, bilateralFilter, filter2D |
| Schwellwert | threshold, adaptiveThreshold |
| Morphologie | erode, dilate, morphologyEx |
| Kanten und Formen | Canny, Sobel, findContours, HoughLinesP |
| Merkmale | ORB_create, SIFT_create, BFMatcher, findHomography |
| Modelle | dnn.readNet, dnn.blobFromImage |
Ein vollständiges Beispiel: Belege zählen
import cv2, numpy as np
img = cv2.imread("belege.jpg")
if img is None:
raise SystemExit("Bild nicht gefunden - Pfad pruefen")
grau = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
weich = cv2.GaussianBlur(grau, (7, 7), 0)
# Otsu waehlt den Schwellwert selbst, aus dem Histogramm.
_, bin_ = cv2.threshold(weich, 0, 255,
cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
kern = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
bin_ = cv2.morphologyEx(bin_, cv2.MORPH_CLOSE, kern) # Loecher schliessen
konturen, _ = cv2.findContours(bin_, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
gross = [k for k in konturen if cv2.contourArea(k) > 5000]
print("gefundene Belege:", len(gross))
for k in gross:
x, y, w, h = cv2.boundingRect(k)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv2.imwrite("belege_markiert.jpg", img)Dieses Beispiel enthält kein maschinelles Lernen und löst eine Aufgabe, für die oft ein Modell vorgeschlagen wird.
Achsenreihenfolgen
Die häufigste Ursache für stille Fehler ist, dass drei Bibliotheken drei Konventionen benutzen.
| Kontext | Reihenfolge | Beispiel |
|---|---|---|
| NumPy-Form eines Bildes | (Höhe, Breite, Kanäle) | img.shape == (1080, 1920, 3) |
cv2.resize | (Breite, Höhe) | cv2.resize(img, (1920, 1080)) |
| Punkte in OpenCV | (x, y) also (Spalte, Zeile) | cv2.circle(img, (x, y), …) |
| Indizierung in NumPy | [y, x] also [Zeile, Spalte] | img[y, x] |
| PyTorch-Tensor | (Batch, Kanäle, Höhe, Breite) | torch.Size([8, 3, 224, 224]) |
Ein Bild, das nach dem Skalieren gestaucht aussieht, ist praktisch immer eine
vertauschte (w, h)-Angabe.
Leistung
cv2.setNumThreads(1)setzen, wenn schon auf Prozessebene parallelisiert wird. Sonst konkurrieren die Thread-Pools.- Video mit
cap.grab()überspringen und nur bei Bedarfcap.retrieve()aufrufen. Das spart die Dekodierung. - Bei vielen kleinen Bildern lohnt
cv2.UMat, das OpenCL nutzt, ohne dass der Code sich ändert. cv2.imencodestattimwrite, wenn das Ergebnis ohnehin in eine Datenbank oder über das Netz geht.
Modelle direkt in OpenCV ausführen
Das Modul dnn liest ONNX-, Caffe- und Darknet-Modelle und führt sie ohne
PyTorch aus. Für Randgeräte und schlanke Container ist das oft die praktischste
Lösung, weil eine Installation von 40 Megabyte genügt statt mehrerer Gigabyte.
netz = cv2.dnn.readNetFromONNX("modell.onnx")
blob = cv2.dnn.blobFromImage(img, scalefactor=1/255.0, size=(640, 640),
swapRB=True, crop=False) # swapRB: BGR -> RGB
netz.setInput(blob)
ausgabe = netz.forward()swapRB=True ist hier nicht optional: fast alle veröffentlichten Modelle wurden
auf RGB trainiert, OpenCV liefert aber BGR. Ohne den Tausch sinkt die Güte
messbar, ohne dass ein Fehler gemeldet wird.
Passende Kurse und Quellen
opencv-python
Das Paket, das OpenCV in eine Python-Umgebung bringt. Ein Befehl, und die klassische Bildverarbeitung steht zur Verfügung.
Ein Befehl, und die klassische Bildverarbeitung steht in der eigenen Umgebung bereit.
OpenCV-Tutorials
Die offiziellen Anleitungen zu Filtern, Kanten, Merkmalen und Kalibrierung, jeweils mit lauffähigem Python-Code.
Für alle, die Bildverarbeitung selbst schreiben; jedes Beispiel ist lauffähig.