Mitarbeiter
Hilfestellungen zu OpenCV
Installation
OpenCV ist in den Ubuntu Paketquellen enthalten und kann apt-get
installiert werden. Weil wir die Bildoperationen auch grafisch darstellen möchten benötigen wir auch noch die GUI Bibliotheken von OpenCV.
sudo apt-get install libopencv-dev libhighgui-dev
OpenCV Datentyp Mat
Bildinformationen werden in OpenCV in dem Matrizen-Datentypen cv::Mat
verwaltet. Dieser ist als C++-Klasse definiert, mit einem Header-Bereich, welcher Informationen wie z.B. die Dimension der Matrix enthält, sowie den eigentlichen Matrix-Einträgen, welche den Farbwerten der einzelnen Pixel des Bildes entsprechen. Praktisch entspricht er damit einem speziellen Container für Billdaten. Eine Matrix kann auf unterschiedliche Weisen erzeugt werden:
cv::Mat A = cv::Mat(480, 640, CV_8UC3, cv::Scalar::all(0));
cv::Mat B = cv::imread("example.png", CV_LOAD_IMAGE_UNCHANGED);
Enthält eine Matrix Farbinformationen, also drei unterschiedliche Intensitätswerte für jedes Pixel, so kann es für einige Operationen nützlich sein, diese Farbkanäle in drei separate Matrizen zu zerlegen (bzw. nach dieser Operation, diese wieder zusammenzuführen). Eine Matrix kann wie folgt in ihre unterschiedlichen Kanäle zerlegt werden (wobei jeder der drei Farbkanäle ebenfalls wieder eine Matrix ist):
std::vector<cv::Mat> planes;
cv::split(A, planes);
Um die Kanäle wieder zu einer Matrix zusammenzufügen, wird die Funktion merge
verwendet:
cv::merge(planes, A);
Auf die Intensität eines Pixels kann mittels der Methode at
zugegriffen werden. Beachtet dabei das OpenCV zuerst die Y-Komponente und dann die X-Komponente der Position erwartet. Eine Iteration über alle Pixel eines Bildes mit drei Farbkanälen sieht z.B. aus wie folgt:
for ( int y = 0; y < image.rows; y++ ) {
for ( int x = 0; x < image.cols; x++ ) {
for ( int c = 0; c < 3; c++ ) {
image.at<Vec3b>(y,x)[c] =
cv::saturate_cast<uchar>( a * ( image.at<Vec3b>(y,x)[c] ) + b );
}
}
}
Dieses Codebeispiel demonstriert auch noch die Verwendung von cv::saturate_cast
welches eine Typumwandlung vornimmt und den Wert dabei auf die Grenzen des neuen Datentyps einhält.
Bei der Zuweisung von Matrizen ist darauf zu achten, ob eine Referenz auf bestehende Matrix-Elemente erzeugt werden soll, oder die Daten kopiert werden sollen:
cv::Mat A(480, 640, CV_64F);
cv::Mat B = A; // Kopiert nur den Header, keine Daten
cv::Mat C = B.clone(); // Kopiert auch Daten
OpenCV und Farbräume
OpenCV bevorzugt normalerweise den BGR
Farbraum (also Blau-Grün-Rot). Das muss man insbesondere wissen, wenn man Bilder lädt oder sie mit cv::imshow
anzeigen möchte. Solltet ihr versuchen etwas anderes als ein BGR
Bild anzuzeigen, ist das Ergebnis vermutlich nicht sehr vorteilhaft.