Работа с изображениями в C++: обзор библиотек и практические примеры
Обработка изображений — одна из ключевых задач в современном программировании, от компьютерного зрения до графических редакторов. В C++ существует несколько мощных библиотек, которые позволяют загружать, обрабатывать и сохранять изображения. В этой статье мы рассмотрим три популярных инструмента: CImg, OpenCV и stb_image. Каждая из них имеет свои особенности, преимущества и области применения.
1. Библиотека CImg
CImg (C++ Image Processing Library) — это легковесная, кроссплатформенная библиотека для обработки изображений. Она распространяется в виде одного заголовочного файла (CImg.h), что делает её идеальной для быстрого прототипирования и небольших проектов. CImg поддерживает форматы BMP, JPEG, PNG, TIFF и другие, но для работы с ними требует установки дополнительных библиотек (например, libpng или libjpeg).
Основные возможности:
- Загрузка, отображение и сохранение изображений.
- Фильтры (размытие, резкость, медианный фильтр).
- Геометрические преобразования (поворот, масштабирование, отражение).
- Работа с цветовыми пространствами (RGB, HSV, Lab).
- Рисование примитивов (линии, окружности, текст).
Пример: загрузка изображения и применение размытия
#include "CImg.h"
using namespace cimg_library;
int main() {
// Загружаем изображение
CImg<unsigned char> image("input.jpg");
// Применяем размытие по Гауссу (радиус 3)
CImg<unsigned char> blurred = image.get_blur(3);
// Сохраняем результат
blurred.save("output_blurred.jpg");
return 0;
}
Этот код демонстрирует минималистичный подход CImg: одна строка для загрузки, одна для обработки и одна для сохранения. Библиотека автоматически управляет памятью.
2. Библиотека OpenCV
OpenCV (Open Source Computer Vision Library) — это де-факто стандарт для задач компьютерного зрения и обработки изображений в C++. Она включает более 2500 оптимизированных алгоритмов, поддерживает GPU-ускорение и активно используется в промышленных решениях, робототехнике и научных исследованиях. OpenCV работает с форматами JPEG, PNG, TIFF, WebP и многими другими.
Основные возможности:
- Загрузка, отображение и запись видео/изображений.
- Фильтрация, морфология, пороговая обработка.
- Детектирование объектов (лиц, автомобилей) с помощью каскадов Хаара или глубокого обучения.
- Калибровка камеры, стереозрение.
- Машинное обучение (SVM, KNN, нейросети).
Пример: изменение размера и преобразование в оттенки серого
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// Загружаем цветное изображение
Mat image = imread("input.jpg", IMREAD_COLOR);
if (image.empty()) {
return -1;
}
// Преобразуем в оттенки серого
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// Уменьшаем размер в 2 раза
Mat resized;
resize(gray, resized, Size(), 0.5, 0.5, INTER_LINEAR);
// Сохраняем результат
imwrite("output_gray_resized.jpg", resized);
return 0;
}
OpenCV использует класс Mat для представления изображений. Все операции выполняются через статические функции или методы. Библиотека требует предварительной установки, но предоставляет максимальную гибкость и производительность.
3. Библиотека stb_image
stb_image — это часть набора однозаголовочных библиотек от Sean Barrett. Она предназначена исключительно для загрузки и сохранения изображений, без функций обработки. Поддерживает форматы JPEG, PNG, BMP, GIF, PSD и другие. Главное преимущество — невероятная простота интеграции: достаточно скопировать файл stb_image.h в проект и определить пару макросов.
Основные возможности:
- Загрузка изображений в сырой массив пикселей (RGB или RGBA).
- Сохранение изображений в форматах PNG, BMP, TGA, JPG (через
stb_image_write.h). - Автоматическое преобразование в оттенки серого или RGBA.
- Минимальный размер кода — идеально для встраиваемых систем.
Пример
Также в библиотеке
Отправка SMS на Swift (iOS/macOS): API MessageUI и сторонние сервисы
WebSocket библиотеки Swift: Starscream и URLSessionWebSocketTask
PDF генерация в Go: Обзор библиотек и практическое руководство
Отправка SMS на C# (.NET): API библиотеки и примеры кода
Работа с датами в Java: обзор библиотек java.time, Joda-Time и Apache Commons