Работа с изображениями: resize и crop на C++ с OpenCV

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

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

Начать курс

Работа с изображениями: 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).

Выбор метода интерполяции

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