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.