Trabajo con imágenes: resize y crop en C++
En la gráfica computacional moderna y la visión artificial, las operaciones de cambio de tamaño (resize) y recorte (crop) de imágenes son fundamentales. Ya sea que esté desarrollando una aplicación de procesamiento de fotos, un sistema de reconocimiento facial o simplemente desee preparar imágenes para una red neuronal, no puede prescindir de estas funciones. En este artículo, veremos en detalle cómo realizar resize y crop en el lenguaje C++ utilizando la potente biblioteca OpenCV.
¿Por qué OpenCV?
OpenCV (Open Source Computer Vision Library) es el estándar de facto para tareas de visión artificial. Está escrita en C/C++ y ofrece cientos de algoritmos optimizados. Para trabajar con resize y crop solo necesitaremos unas pocas funciones, pero su rendimiento y flexibilidad hacen de OpenCV la elección ideal.
Puede instalar OpenCV a través de un gestor de paquetes (por ejemplo, vcpkg install opencv o brew install opencv), o compilándolo desde el código fuente. Los detalles de instalación están fuera del alcance de este artículo, pero se asume que ya tiene un proyecto configurado con la biblioteca vinculada.
Preparación: cargar una imagen
Antes de modificar algo, la imagen debe cargarse. En OpenCV esto se hace con la función imread():
#include <opencv2/opencv.hpp>#include <iostream>
using namespace cv;using namespace std;
int main() { // Cargamos la imagen Mat image = imread("input.jpg"); if (image.empty()) { cerr << "¡Error al cargar la imagen!" << endl; return -1; } cout << "Tamaño de la imagen original: " << image.cols << " x " << image.rows << endl; return 0;}La función devuelve un objeto de tipo Mat (matriz). Si el archivo no se encuentra o está dañado, image.empty() devolverá true.
Cambio de tamaño de imagen (resize) en C++
La función resize() en OpenCV permite escalar una imagen a dimensiones arbitrarias. Soporta varios métodos de interpolación que afectan la calidad del resultado.
Sintaxis de resize
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);- src — imagen de origen.
- dst — imagen de destino.
- dsize — nuevo tamaño (ancho, alto). Puede especificarse explícitamente o calcularse mediante
fxyfy. - fx — factor de escala en el ancho (si dsize = Size()).
- fy — factor de escala en el alto.
- interpolation — método de interpolación. Opciones principales:
INTER_NEAREST— vecino más cercano (rápido, pero con artefactos).INTER_LINEAR— bilineal (por defecto, buen equilibrio).INTER_CUBIC— bicúbica (más lenta, pero de mayor calidad).INTER_AREA— se usa al reducir la imagen (área de píxeles).
Ejemplo 1: Reducción a un tamaño fijo
Mat resized;Size newSize(300, 200); // Ancho 300, alto 200resize(image, resized, newSize, 0, 0, INTER_AREA);imwrite("resized_fixed.jpg", resized);cout << "Tamaño después de resize: " << resized.cols << " x " << resized.rows << endl;Ejemplo 2: Escalado a la mitad manteniendo la proporción
Mat scaled;resize(image, scaled, Size(), 0.5, 0.5, INTER_LINEAR);imwrite("scaled_half.jpg", scaled);Si se especifica dsize = Size(), los nuevos tamaños se calculan mediante las fórmulas: dsiz