Базовые операции OpenCV для C++

Базовые операции с изображениями

Чтение, отображение и сохранение изображений

В OpenCV базовые операции с изображениями включают чтение, отображение и сохранение изображений. Эти операции являются основой обработки изображений.

Чтение изображений: используйтеimreadфункцию для чтения изображения. Первый параметр этой функции — путь к файлу изображения, а второй параметр — способ чтения изображения (например, цветное изображение, изображение в оттенках серого и т. д.).

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

Отображение изображений: используйтеimshowфункцию для отображения изображения. Первый параметр этой функции — имя окна, а второй параметр — отображаемое изображение.

cv::imshow("Display Window", image);
cv::waitKey(0); // 等待按键按下
Сохранение изображений: используйтеimwriteфункцию для сохранения изображения. Первый параметр этой функции — путь к файлу для сохранения, а второй параметр — сохраняемое изображение.
cv::imwrite("output.jpg", image);

Базовые свойства изображений

Базовые свойства изображения включают размер, количество каналов и значения пикселей.

Размер: Размер изображения можно получить черезrowsиcolsатрибута.

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

Количество каналов: Количество каналов изображения можно получить черезchannels()метод.

int channels = image.channels();

Значения пикселей: доступ к ним можно получить черезatметод для доступа к значениям пикселей изображения.

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

Создание и инициализация изображений

Вы можете использоватьMatкласс для создания и инициализации изображений.

Создание изображений: Вы можете создать изображение заданного размера и типа.

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

Инициализация изображений: ИспользуйтеsetToметод для инициализации изображения.

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

Операции с пикселями изображений

Операции с пикселями изображения включают перебор пикселей и изменение значений пикселей.

Перебор пикселей: Вы можете использовать двойной цикл для перебора каждого пикселя изображения.

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);
        // 对像素进行操作
    }
}

Изменение значений пикселей: Вы можете напрямую изменять значение пикселя.

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

Геометрические преобразования изображений

Масштабирование, поворот, перенос и отражение

Геометрические преобразования изображения включают масштабирование, поворот, перенос и отражение.

Масштабирование: Используйтеresizeфункцию для масштабирования изображения.

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

Поворот: ИспользуйтеgetRotationMatrix2DиwarpAffineфункцию для поворота изображения.

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());

Перенос: ИспользуйтеwarpAffineфункцию для переноса изображения.

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

Отражение: Используйтеflipфункцию для отражения изображения.

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

Аффинное преобразование и перспективное преобразование

Аффинное преобразование: Аффинное преобразование — это линейное преобразование плюс перенос, и его можно реализовать с помощьюwarpAffineфункцию.

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

Перспективное преобразование: Перспективное преобразование — это более общее преобразование, и его можно реализовать с помощьюwarpPerspectiveфункцию.

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

Преобразование цветового пространства изображений

Цветовые пространства, такие как RGB, оттенки серого и HSV

Цветовые пространства изображения включают RGB, оттенки серого, HSV и т. д.

  • RGB: RGB — наиболее распространённое цветовое пространство, представляющее три канала: красный, зелёный и синий.
  • Оттенки серого: Изображение в оттенках серого имеет только один канал, который представляет яркость.
  • HSV: Цветовое пространство HSV представляет оттенок, насыщенность и значение.

Преобразование цветового пространства

ИспользуйтеcvtColorфункция для выполнения преобразования цветового пространства.

Преобразование RGB в оттенки серого:

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

Преобразование RGB в HSV:

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

Разделение и объединение каналов

Разделение каналов: Используйтеsplitфункцию для разделения каналов изображения.

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

Объединение каналов: Используйтеmergeфункцию для объединения нескольких каналов в одно изображение.

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

Примеры

Основные операции C++ OpenCV включают чтение изображений, отображение, сохранение, операции с пикселями, получение свойств изображения и т. д.

Ниже приведены некоторые распространённые базовые операции OpenCV и примеры их кода:

1. Чтение и отображение изображений

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    // Проверьте, успешно ли загружено изображение
    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Отобразить изображение
    namedWindow("Отобразить изображение", WINDOW_AUTOSIZE);
    imshow("Отобразить изображение", image);

    // Ожидание нажатия клавиши
    waitKey(0);

    // Закрыть окно
    destroyAllWindows();

    return 0;
}

2. Сохранение изображений

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Сохранить изображение
    bool isSaved = imwrite("saved_image.jpg", image);
    if (isSaved) {
        cout << "Изображение успешно сохранено!" << endl;
    } else {
        cout << "Не удалось сохранить изображение!" << endl;
    }

    return 0;
}

3. Получение свойств изображения

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Получить свойства изображения
    int width = image.cols;  // Ширина изображения
    int height = image.rows; // Высота изображения
    int channels = image.channels(); // Количество каналов изображения

    cout << "Ширина изображения: " << width << endl;
    cout << "Высота изображения: " << height << endl;
    cout << "Количество каналов изображения: " << channels << endl;

    return 0;
}

4. Доступ к значениям пикселей и их изменение

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Доступ к значениям пикселей (формат BGR)
    Vec3b pixel = image.at<Vec3b>(100, 100); // Получить значение пикселя в позиции (100, 100)
    cout << "B: " << (int)pixel[0] << ", G: " << (int)pixel[1] << ", R: " << (int)pixel[2] << endl;

    // Изменить значение пикселя
    image.at<Vec3b>(100, 100) = Vec3b(255, 0, 0); // Установить пиксель в позиции (100, 100) в синий цвет

    // Отобразить изменённое изображение
    imshow("Изменённое изображение", image);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

5. Преобразование цветового пространства изображения

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Преобразовать в оттенки серого
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);

    // Отобразить изображение в оттенках серого
    imshow("Изображение в оттенках серого", grayImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

6. Обрезка и масштабирование изображений

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Обрезать изображение
    Rect roi(100, 100, 200, 200); // (x, y, ширина, высота)
    Mat croppedImage = image(roi);

    // Масштабировать изображение
    Mat resizedImage;
    resize(image, resizedImage, Size(400, 400)); // Масштабировать до 400x400

    // Отобразить обрезанное и масштабированное изображение
    imshow("Cropped Image", croppedImage);
    imshow("Resized Image", resizedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

7. Копирование и клонирование изображений

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Копировать изображение
    Mat copiedImage = image.clone();

    // Изменить скопированное изображение
    circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // Нарисовать круг на скопированном изображении

    // Отобразить исходное изображение и изменённое изображение
    imshow("Исходное изображение", image);
    imshow("Скопированное изображение", copiedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

8. Геометрические преобразования изображений

Пример

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

using namespace cv;
using namespace std;

int main() {
    // Прочитать изображение
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
        return -1;
    }

    // Повернуть изображение
    Mat rotatedImage;
    Point2f center(image.cols / 2, image.rows / 2); // Центр вращения
    double angle = 45; // Угол поворота
    double scale = 1.0; // Коэффициент масштабирования
    Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
    warpAffine(image, rotatedImage, rotationMatrix, image.size());

    // Отобразить повернутое изображение
    imshow("Повернутое изображение", rotatedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}
Другие расширения