OpenCV для C++: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое OpenCV и зачем он нужен?

OpenCV (Open Source Computer Vision Library) — это кроссплатформенная библиотека с открытым исходным кодом, предназначенная для задач компьютерного зрения и машинного обучения. Она предоставляет более 2500 оптимизированных алгоритмов, которые охватывают практически все области компьютерного зрения: от простой обработки изображений (фильтрация, геометрические преобразования) до сложных задач (распознавание лиц, отслеживание объектов, 3D-реконструкция, анализ видео).

Библиотека написана на C++ и C, что обеспечивает высокую производительность, и имеет привязки к Python, Java, MATLAB и другим языкам. В данном руководстве мы сосредоточимся на использовании OpenCV именно из C++ — это оптимальный выбор для production-систем, где критичны скорость работы и эффективное управление памятью.

Зачем нужен OpenCV?

  • Обработка изображений: изменение размера, поворот, фильтрация, улучшение контраста, коррекция цвета.
  • Анализ видео: чтение/запись видео, обнаружение движения, трекинг объектов.
  • Распознавание объектов: лица, автомобили, текст (OCR), жесты.
  • Калибровка камер: устранение искажений, стереозрение.
  • Машинное обучение: встроенные классификаторы (SVM, KNN, Decision Trees) и интеграция с DNN (Deep Neural Networks) для работы с моделями TensorFlow, Caffe, PyTorch.

Установка OpenCV для C++

В отличие от Python, где достаточно одной команды pip install opencv-python, установка OpenCV для C++ требует компиляции или использования готовых бинарных пакетов. Рассмотрим основные способы.

1. Установка через пакетный менеджер (Linux/macOS)

Ubuntu/Debian:

sudo apt update
sudo apt install libopencv-dev

macOS (Homebrew):

brew install opencv

2. Установка через vcpkg (Windows, Linux, macOS)

vcpkg — это кроссплатформенный менеджер пакетов от Microsoft. Сначала установите vcpkg:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh  # Linux/macOS
.\bootstrap-vcpkg.bat # Windows

Затем установите OpenCV:

./vcpkg install opencv4

После установки подключите библиотеку в CMake:

cmake_minimum_required(VERSION 3.10)
project(MyOpenCVProject)
find_package(OpenCV REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})

3. Сборка из исходников (продвинутый уровень)

Этот способ дает максимальный контроль над включаемыми модулями и оптимизациями:

git clone https://github.com/opencv/opencv.git
cd opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_TBB=ON \
      -D WITH_V4L=ON \
      -D WITH_QT=ON \
      -D WITH_OPENGL=ON ..
make -j$(nproc)
sudo make install

Быстрый старт: загрузка и отображение изображения

Проверим, что OpenCV установлен корректно, написав простую программу, которая загружает изображение, преобразует его в оттенки серого и отображает.

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

int main() {
    // Загружаем изображение
    cv::Mat img = cv::imread("example.jpg");
    if (img.empty()) {
        std::cerr << "Не удалось загрузить изображение!" << std::endl;
        return -1;
    }

    // Преобразуем в оттенки серого
    cv::Mat gray;
    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);

    // Отображаем оба изображения
    cv::imshow("Original", img);
    cv::imshow("Gray", gray);

    // Ждем нажатия клавиши
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

Компиляция:

g++ -std=c++11 main.cpp -o main `pkg-config --cflags --libs opencv4`

Основные методы и функции OpenCV (C++)

Ниже приведены 10 ключевых функций/методов, которые составляют основу работы с библиотекой.

1. cv::imread() — Загрузка изображения

Описание: Читает изображение из файла и возвращает его в виде матрицы cv::Mat.

Параметры:

  • filename (const std::string&) — путь к файлу.
  • flags (int) — режим чтения:
    • cv::IMREAD_COLOR (1) — цветное (BGR, 3 канала).
    • cv::IMREAD_GRAYSCALE (0) — оттенки серого.
    • cv::IMREAD_UNCHANGED (-1) — как есть, включая альфа-канал.

Пример:

cv::Mat color_img = cv::imread("photo.jpg", cv::IMREAD_COLOR);
cv::Mat gray_img  = cv::imread("photo.jpg", cv::IMREAD_GRAYSCALE);

2. cv::imwrite() — Сохранение изображения

Описание: Сохраняет матрицу в файл. Поддерживаемые форматы: PNG, JPEG, BMP, TIFF и др.

Параметры:

  • filename (const std::string&) — имя выходного файла.
  • img (cv::InputArray) — изображение для сохранения.
  • params (const std::vector<int>&) — параметры кодирования (опционально).

Пример:

cv::Mat processed;
cv::GaussianBlur(img, processed, cv::Size(5,5), 1.5);
cv::imwrite("blurred.jpg", processed);

3. cv::cvtColor() — Преобразование цветовых пространств

Описание: Конвертирует изображение из одного цветового пространства в другое (BGR↔GRAY, BGR↔HSV, BGR↔Lab и т.д.).

Параметры:

  • src (cv::InputArray) — исходное изображение.
  • dst (cv::OutputArray) — результирующее изображение.
  • code (int) — код преобразования (например, cv::COLOR_BGR2HSV).
  • dstCn (int) — количество каналов в выходном изображении (0 = автоматически).

Пример:

cv::Mat hsv;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);

4. cv::resize() — Изменение размера изображения

Описание: Масштабирует изображение до заданного размера или коэффициента.

Параметры:

  • src (cv::InputArray) — исходное изображение.
  • dst (cv::OutputArray) — выходное изображение.
  • dsize (cv::Size) — новый размер (ширина, высота).
  • fx (double) — масштаб по горизонтали (используется, если dsize = 0).
  • fy (double) — масштаб по вертикали.
  • interpolation (int) — метод интерполяции:
    • cv::INTER_LINEAR (по умолчанию, билинейная).
    • cv::INTER_NEAREST (ближайший сосед).
    • cv::INTER_CUBIC (бикубическая).
    • cv::INTER_AREA (для уменьшения изображений).

Пример:

cv::Mat resized;
cv::resize(img, resized, cv::Size(640, 480)); // точный размер
// или с коэффициентом:
cv::resize(img, resized, cv::Size(), 0.5, 0.5); // уменьшить вдвое

5. cv::GaussianBlur() — Гауссово размытие

Описание: Применяет фильтр Гаусса для сглаживания изображения и подавления шума.

Параметры:

  • src (cv::InputArray) — входное изображение.
  • dst (cv::OutputArray) — выходное изображение.
  • ksize (cv::Size) — размер ядра (должен быть нечетным и положительным).
  • sigmaX (double) — стандартное отклонение по X.
  • sigmaY (double) — стандартное отклонение по Y (0 = равно sigmaX).
  • borderType (int) — тип обработки границ.

Пример:

cv::Mat blurred;
cv::GaussianBlur(img, blurred, cv::Size(5,5), 1.5);

6. cv::Canny() — Детектор границ Кэнни

Описание: Обнаруживает границы на изображении, используя многоступенчатый алгоритм.

Параметры:

  • image (cv::InputArray) — 8-битное одноканальное изображение.
  • edges (cv::OutputArray) — выходное изображение границ.
  • threshold1 (double) — нижний порог.
  • threshold2 (double) — верхний порог.
  • apertureSize (int) — размер апертуры оператора Собеля (3, 5, 7).
  • L2gradient (bool) — использовать более точное L2-нормирование.

Пример:

cv::Mat edges;
cv::Canny(gray, edges, 50, 150);

7. cv::HoughLinesP() — Вероятностное преобразование Хафа для линий

Описание: Находит отрезки прямых линий на бинарном изображении (обычно после Canny).

Параметры:

  • image (cv::InputArray) — 8-битное одноканальное изображение.
  • lines (cv::OutputArray) — вектор найденных линий (cv::Vec4i).
  • rho (double) — разрешение по расстоянию в пикселях.
  • theta (double) — разрешение по углу в радианах.
  • threshold (int) — минимальное количество пересечений для детектирования линии.
  • minLineLength (double) — минимальная длина отрезка.
  • maxLineGap (double) — максимальный разрыв между точками на одной линии.

Пример:

                    

Рекомендаций