Работа с изображениями: resize и crop на C++
В современной компьютерной графике и компьютерном зрении операции изменения размера (resize) и обрезки (crop) изображений являются фундаментальными. Независимо от того, разрабатываете ли вы приложение для обработки фотографий, систему распознавания лиц или просто хотите подготовить изображения для нейросети — без этих функций не обойтись. В данной статье мы подробно рассмотрим, как выполнять resize и crop на языке C++ с использованием мощной библиотеки OpenCV.
Почему OpenCV?
OpenCV (Open Source Computer Vision Library) — это де-факто стандарт для задач компьютерного зрения. Она написана на C/C++ и предоставляет сотни оптимизированных алгоритмов. Для работы с resize и crop нам потребуется всего несколько функций, но их производительность и гибкость делают OpenCV идеальным выбором.
Установить OpenCV можно через пакетный менеджер (например, vcpkg install opencv или brew install opencv), либо собрав из исходников. Подробности установки выходят за рамки статьи, но предполагается, что у вас уже настроен проект с подключенной библиотекой.
Подготовка: загрузка изображения
Прежде чем что-то менять, изображение нужно загрузить. В OpenCV это делается функцией imread():
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Загружаем изображение
Mat image = imread("input.jpg");
if (image.empty()) {
cerr << "Ошибка загрузки изображения!" << endl;
return -1;
}
cout << "Размер исходного изображения: "
<< image.cols << " x " << image.rows << endl;
return 0;
}
Функция возвращает объект типа Mat (матрица). Если файл не найден или поврежден, image.empty() вернет true.
Изменение размера изображения (resize) на C++
Функция resize() в OpenCV позволяет масштабировать изображение до произвольных размеров. Она поддерживает несколько интерполяционных методов, которые влияют на качество результата.
Синтаксис resize
void resize(InputArray src, OutputArray dst, Size dsize,
double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
- src — исходное изображение.
- dst — результирующее изображение.
- dsize — новый размер (ширина, высота). Может быть задан явно или вычислен через
fxиfy. - fx — масштабный коэффициент по ширине (если dsize = Size()).
- fy — масштабный коэффициент по высоте.
- interpolation — метод интерполяции. Основные варианты:
INTER_NEAREST— ближайший сосед (быстро, но с артефактами).INTER_LINEAR— билинейная (по умолчанию, хороший баланс).INTER_CUBIC— бикубическая (медленнее, но качественнее).INTER_AREA— используется при уменьшении изображения (пиксельная область).
Пример 1: Уменьшение до фиксированного размера
Mat resized;
Size newSize(300, 200); // Ширина 300, высота 200
resize(image, resized, newSize, 0, 0, INTER_AREA);
imwrite("resized_fixed.jpg", resized);
cout << "Размер после resize: " << resized.cols << " x " << resized.rows << endl;
Пример 2: Масштабирование в 2 раза с сохранением пропорций
Mat scaled;
resize(image, scaled, Size(), 0.5, 0.5, INTER_LINEAR);
imwrite("scaled_half.jpg", scaled);
Если указать dsize = Size(), то новые размеры вычисляются по формулам: dsize.width = round(src.cols * fx) и dsize.height = round(src.rows * fy).
Выбор метода интерполяции
- Для уменьшения изображения лучше использовать
INTER_AREA— он дает более четкие результаты и меньше муара. - Для увеличения —
INTER_CUBICТакже в библиотеке
Рекомендаций