Grundlegende Operationen mit C++ OpenCV

Grundlegende Bildoperationen

Bilder lesen, anzeigen und speichern

In OpenCV umfassen die grundlegenden Operationen an Bildern das Lesen, Anzeigen und Speichern von Bildern. Diese Operationen sind die Grundlage der Bildverarbeitung.

Bilder lesen: Verwenden Sie dieimreadFunktion, um ein Bild zu lesen. Der erste Parameter dieser Funktion ist der Pfad der Bilddatei, und der zweite Parameter ist die Art und Weise, das Bild zu lesen (z. B. Farbbild, Graustufenbild usw.).

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);

Bilder anzeigen: Verwenden Sie dieimshowFunktion, um ein Bild anzuzeigen. Der erste Parameter dieser Funktion ist der Name des Fensters, und der zweite Parameter ist das anzuzeigende Bild.

cv::imshow("Display Window", image);
cv::waitKey(0); // 等待按键按下
Bilder speichern: Verwenden Sie dieimwriteFunktion, um ein Bild zu speichern. Der erste Parameter dieser Funktion ist der Pfad der zu speichernden Datei, und der zweite Parameter ist das zu speichernde Bild.
cv::imwrite("output.jpg", image);

Grundlegende Eigenschaften von Bildern

Die grundlegenden Eigenschaften eines Bildes umfassen Größe, Anzahl der Kanäle und Pixelwerte.

Größe: Die Größe eines Bildes kann durch dierowsundcolsAttributs.

int height = image.rows;
int width = image.cols;

Anzahl der Kanäle: Die Anzahl der Kanäle eines Bildes kann durch diechannels()Methode.

int channels = image.channels();

Pixelwerte: können durch dieatMethode zum Zugriff auf die Pixelwerte eines Bildes.

cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 访问(x, y)处的像素值

Erstellung und Initialisierung von Bildern

Sie können dieMatKlasse zum Erstellen und Initialisieren von Bildern.

Erstellen von Bildern: Sie können ein Bild mit einer angegebenen Größe und einem angegebenen Typ erstellen.

cv::Mat newImage(480, 640, CV_8UC3, cv::Scalar(0, 0, 255)); // 创建一个640x480的红色图像

Initialisieren von Bildern: Verwenden Sie diesetToMethode zum Initialisieren eines Bildes.

image.setTo(cv::Scalar(255, 255, 255)); // 将图像初始化为白色

Pixeloperationen auf Bildern

Pixeloperationen auf einem Bild umfassen das Iterieren über Pixel und das Ändern von Pixelwerten.

Iterieren über Pixel: Sie können eine doppelte Schleife verwenden, um über jeden Pixel des Bildes zu iterieren.

for (int y = 0; y < image.rows; y++) {
    for (int x = 0; x < image.cols; x++) {
        cv::Vec3b& pixel = image.at<cv::Vec3b>(y, x);
        // 对像素进行操作
    }
}

Ändern von Pixelwerten: Sie können den Wert eines Pixels direkt ändern.

pixel[0] = 255; // 将蓝色通道设置为255
pixel[1] = 0;   // 将绿色通道设置为0
pixel[2] = 0;   // 将红色通道设置为0

Geometrische Transformationen von Bildern

Skalierung, Rotation, Translation und Spiegeln

Geometrische Transformationen eines Bildes umfassen Skalierung, Rotation, Translation und Spiegeln.

Skalierung: Verwenden Sie dieresizeFunktion, um ein Bild zu skalieren.

cv::Mat resizedImage;
cv::resize(image, resizedImage, cv::Size(newWidth, newHeight));

Rotation: Verwenden Sie diegetRotationMatrix2DundwarpAffineFunktion, um ein Bild zu drehen.

cv::Point2f center(image.cols / 2.0, image.rows / 2.0);
cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Mat rotatedImage;
cv::warpAffine(image, rotatedImage, rotationMatrix, image.size());

Translation: Verwenden Sie diewarpAffineFunktion, um ein Bild zu verschieben.

cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) << 1, 0, tx, 0, 1, ty);
cv::Mat translatedImage;
cv::warpAffine(image, translatedImage, translationMatrix, image.size());

Spiegeln: Verwenden Sie dieflipFunktion, um ein Bild zu spiegeln.

cv::Mat flippedImage;
cv::flip(image, flippedImage, 1); // 1表示水平翻转,0表示垂直翻转

Affine Transformation und perspektivische Transformation

Affine Transformation: Eine affine Transformation ist eine lineare Transformation plus Translation und kann mithilfe derwarpAffineFunktion.

cv::Mat affineMatrix = cv::getAffineTransform(srcPoints, dstPoints);
cv::Mat affineImage;
cv::warpAffine(image, affineImage, affineMatrix, image.size());

Perspektivische Transformation: Die perspektivische Transformation ist eine allgemeinere Transformation und kann mithilfe derwarpPerspectiveFunktion.

cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints);
cv::Mat perspectiveImage;
cv::warpPerspective(image, perspectiveImage, perspectiveMatrix, image.size());

Farbraumkonvertierung von Bildern

Farbräume wie RGB, Graustufen und HSV

Die Farbräume eines Bildes umfassen RGB, Graustufen, HSV usw.

  • RGB: RGB ist der gebräuchlichste Farbraum und repräsentiert drei Kanäle: Rot, Grün und Blau.
  • Graustufen: Ein Graustufenbild hat nur einen Kanal, der die Helligkeit repräsentiert.
  • HSV: Der HSV-Farbraum repräsentiert Farbton, Sättigung und Wert.

Farbraumkonvertierung

Verwenden Sie diecvtColorFunktion zur Durchführung der Farbraumkonvertierung.

RGB zu Graustufen:

cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

RGB nach HSV:

cv::Mat hsvImage;
cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

Kanaltrennung und Zusammenführung

Kanaltrennung: Verwenden Sie diesplitFunktion, um die Kanäle eines Bildes zu trennen.

std::vector<cv::Mat> channels;
cv::split(image, channels);

Kanalzusammenführung: Verwenden Sie diemergeFunktion, um mehrere Kanäle zu einem Bild zusammenzuführen.

cv::Mat mergedImage;
cv::merge(channels, mergedImage);

Beispiele

Die grundlegenden Operationen von C++ OpenCV umfassen das Lesen, Anzeigen und Speichern von Bildern, Pixeloperationen, das Abrufen von Bildeigenschaften usw.

Im Folgenden finden Sie einige häufige grundlegende OpenCV-Operationen und ihre Codebeispiele:

1. Bilder lesen und anzeigen

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    // Prüfen, ob das Bild erfolgreich geladen wurde
    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bild anzeigen
    namedWindow("Bild anzeigen", WINDOW_AUTOSIZE);
    imshow("Bild anzeigen", image);

    // Auf Tastendruck warten
    waitKey(0);

    // Das Fenster schließen
    destroyAllWindows();

    return 0;
}

2. Bilder speichern

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bild speichern
    bool isSaved = imwrite("saved_image.jpg", image);
    if (isSaved) {
        cout << "Bild erfolgreich gespeichert!" << endl;
    } else {
        cout << "Bild konnte nicht gespeichert werden!" << endl;
    }

    return 0;
}

3. Bildeigenschaften abrufen

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bildeigenschaften abrufen
    int width = image.cols;  // Bildbreite
    int height = image.rows; // Bildhöhe
    int channels = image.channels(); // Anzahl der Bildkanäle

    cout << "Bildbreite: " << width << endl;
    cout << "Bildhöhe: " << height << endl;
    cout << "Anzahl der Bildkanäle: " << channels << endl;

    return 0;
}

4. Zugriff auf und Änderung von Pixelwerten

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Zugriff auf Pixelwerte (BGR-Format)
    Vec3b pixel = image.at<Vec3b>(100, 100); // Pixelwert an Position (100, 100) abrufen
    cout << "B: " << (int)pixel[0] << ", G: " << (int)pixel[1] << ", R: " << (int)pixel[2] << endl;

    // Pixelwert ändern
    image.at<Vec3b>(100, 100) = Vec3b(255, 0, 0); // Pixel an Position (100, 100) auf Blau setzen

    // Das modifizierte Bild anzeigen
    imshow("Modifiziertes Bild", image);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

5. Bild-Farbraumkonvertierung

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // In Graustufenbild konvertieren
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);

    // Das Graustufenbild anzeigen
    imshow("Graustufenbild", grayImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

6. Zuschneiden und Skalieren von Bildern

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bild zuschneiden
    Rect roi(100, 100, 200, 200); // (x, y, Breite, Höhe)
    Mat croppedImage = image(roi);

    // Bild skalieren
    Mat resizedImage;
    resize(image, resizedImage, Size(400, 400)); // Auf 400x400 skalieren

    // Das zugeschnittene und skalierte Bild anzeigen
    imshow("Zugeschnittenes Bild", croppedImage);
    imshow("Skaliertes Bild", resizedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

7. Kopieren und Klonen von Bildern

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bild kopieren
    Mat copiedImage = image.clone();

    // Das kopierte Bild ändern
    circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // Einen Kreis auf das kopierte Bild zeichnen

    // Das Originalbild und das geänderte Bild anzeigen
    imshow("Originalbild", image);
    imshow("Kopiertes Bild", copiedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

8. Geometrische Transformationen von Bildern

Beispiel

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Bild einlesen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Fehler: Bild konnte nicht geladen werden, bitte überprüfen Sie, ob der Pfad korrekt ist." << endl;
        return -1;
    }

    // Bild drehen
    Mat rotatedImage;
    Point2f center(image.cols / 2, image.rows / 2); // Drehzentrum
    double angle = 45; // Drehwinkel
    double scale = 1.0; // Skalierungsverhältnis
    Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
    warpAffine(image, rotatedImage, rotationMatrix, image.size());

    // Das gedrehte Bild anzeigen
    imshow("Gedrehtes Bild", rotatedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}
Andere Erweiterungen