Что такое 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) — максимальный разрыв между точками на одной линии.
Пример:
Также в библиотеке
Отправка SMS на Java: обзор API библиотек (Twilio, Nexmo, SMS-шлюзы)
Работа с ZIP-архивами в Node.js: полное руководство
Работа с Markdown в TypeScript: библиотеки, парсеры и инструменты
Валидация данных в PHP: Полное руководство по инструментам и библиотекам
Kysely для TypeScript: полное руководство с примерами