Schwerpunkte

HMI / GUI-Frameworks

OpenCV und Qt Quick - ein Einstieg

21. Januar 2019, 13:31 Uhr   |  Berthold Krevert und Torsten Rahn, Software-Entwickler bei basysKom


Fortsetzung des Artikels von Teil 1 .

Austausch zwischen den internen Bildformaten

Sowohl OpenCV als auch Qt implementieren ihre eigenen Klassen zum Speichern von gerasterten Bilddaten:

  • Die OpenCV-Nomenklatur behandelt mehrdimensionale Daten wie Matrizen, damit ist es logisch, Bildpunkte in sogenannten cv::Mat-Objekten abzulegen.  
  • Qt besitzt mehrere Klassen zum Abspeichern von Bildern, an dieser Stelle wird die QImage-Klasse betrachtet.

Listing 1 zeigt, wie ein png-Bild in eine cv::Mat geladen und später in ein QImage-Objekt konvertiert wird, das Qt weiterverarbeiten und anzeigen kann.

Listing 1

cv::Mat cvImage = cv::imread("foo.png", CV_LOAD_IMAGE_COLOR);
// Bildverarbeitung mit OpenCV
QImage img((uchar*) cvImage.data, cvImage.cols, cvImage.rows, cvImage.step, QImage::Format_RGB888));
img = img.rgbSwapped().copy();

Der hier verwendete Konstruktor von QImage erhält die Rohdaten des Bildes als ersten Parameter. Damit QImage die Datenstruktur erkennt, benötigt der Konstruktor ebenfalls Informationen über Breite (cvImage.cols) und Höhe (cvImage.rows) des Bildes, sowie über Anzahl und Layout der Farbkanäle.

Im Kurzbeispiel werden nur Bilder konvertiert, die jeweils einen acht Bit breiten roten, grünen und blauen Farbkanal haben. OpenCV erwartet die Farbkanäle in der Reihenfolge Blau-Grün-Rot (BGR). Zur Konvertierung empfiehlt sich daher RGB888 als Format für das QImage: unabhängig von der Endianness wird intern stets die Farbkanalreihenfolge RGB verwendet. Zum Wechsel von BGR auf RGB wird daher die Funktion QImage::rgbSwapped() aufgerufen. In den meisten Fällen reicht diese Information aus.

Es gibt allerdings Bilder, in denen nach jeder Zeile ein paar zusätzliche Bytes (Padding) eingeschoben sind, auf manchen Prozessorarchitekturen werden diese damit schneller verarbeitet. Die Anzahl der Bytes pro Bildzeile erfährt der QImage-Konstruktor über den vierten Parameter.

cv::Mat stellt die Information über die Eigenschaft step bereit. cv::Mat-Objekte können ihre Daten mit anderen cv::Mat-Objekten teilen. Sie enthalten einen Referenz-Counter, geben ihren Speicher also frei, sobald er von keiner cv::Mat mehr benötigt wird. Davon, dass unser neu erstelltes QImage-Objekt nun ebenfalls auf den Bilddaten arbeitet, weiß die cv::Mat nichts. Der Entwickler muss also dafür sorgen, dass die Bilddaten über die gesamte Lebensdauer des QImage-Objekts gültig bleiben oder die Daten kopieren.

Seite 2 von 5

1. OpenCV und Qt Quick - ein Einstieg
2. Austausch zwischen den internen Bildformaten
3. Einführung in Qt Quick und QML
4. OpenCV unter Qt Quick
5. Experimentieren mit LiveCV

Auf Facebook teilenAuf Twitter teilenAuf Linkedin teilenVia Mail teilen

Das könnte Sie auch interessieren

KI-Prozessoren mit „Synapsen“ aus Nanodrähten
Zehn Prognosen zur wirtschaftlichen Entwicklung
»Viele Jobs werden vor künstlicher Intelligenz sicher sein«
Professionelle Displays, Kapazitätsausbau und Preisdruck
Kompaktere und günstigere Gassensoren
Augen und Intelligenz für Roboter

Verwandte Artikel

WEKA FACHMEDIEN GmbH