Schwerpunkte
21. Januar 2019, 13:31 Uhr | Berthold Krevert und Torsten Rahn, Software-Entwickler bei basysKom
Sowohl OpenCV als auch Qt implementieren ihre eigenen Klassen zum Speichern von gerasterten Bilddaten:
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.