Trabajo con imágenes: resize y crop en C++ con OpenCV
\n\nEn el desarrollo moderno de aplicaciones, especialmente en el ámbito de la visión por computadora, el web scraping o el procesamiento de archivos multimedia, a menudo surge la necesidad de cambiar el tamaño (resize) y recortar (crop) imágenes de forma programática. El lenguaje C++ combinado con la potente biblioteca OpenCV proporciona todas las herramientas necesarias para ello. En este artículo, analizaremos en detalle cómo realizar estas operaciones, qué parámetros afectan la calidad del resultado y proporcionaremos ejemplos de código listos para usar.
\n\nLa biblioteca OpenCV: el estándar de facto para trabajar con imágenes en C++
\n\nOpenCV (Open Source Computer Vision Library) es una biblioteca multiplataforma de código abierto que contiene cientos de algoritmos optimizados para el procesamiento de imágenes y video. Está escrita en C++ y tiene enlaces para Python, Java y otros lenguajes. Para C++, OpenCV es la solución más eficiente y funcional.
\n\nPrincipales ventajas de OpenCV para las tareas de resize y crop:
\n- \n
- Alta velocidad: todas las funciones utilizan instrucciones SIMD y subprocesamiento múltiple. \n
- Flexibilidad: soporte para varios métodos de interpolación (bilineal, bicúbica, método Lanczos, etc.). \n
- Comodidad: trabajo con imágenes a través de la clase
cv::Mat, que gestiona la memoria automáticamente. \n
Instalación de OpenCV para C++
\nPara empezar, es necesario instalar la biblioteca. La forma más común es a través del gestor de paquetes vcpkg o compilando desde el código fuente. Ejemplo de instalación mediante vcpkg:
\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install opencv4\n\nDespués de la instalación, enlace la biblioteca en su archivo CMakeLists.txt:
\nfind_package(OpenCV REQUIRED)\ntarget_link_libraries(your_project ${OpenCV_LIBS})\n\nCambio de tamaño de imagen (resize)
\nLa función cv::resize() permite cambiar las dimensiones de la imagen original a un ancho y alto determinados. Sintaxis:
cv::resize(\n InputArray src, // imagen original\n OutputArray dst, // imagen resultante\n Size dsize, // nuevo tamaño (ancho, alto)\n double fx = 0, // escala en X (si no se especifica dsize)\n double fy = 0, // escala en Y\n int interpolation = INTER_LINEAR // método de interpolación\n);\n\nEl parámetro interpolation determina el algoritmo utilizado para calcular los nuevos píxeles. Las principales opciones son:
- \n
INTER_NEAREST: método del vecino más cercano (rápido, pero baja calidad). \n INTER_LINEAR: interpolación bilineal (buen equilibrio entre velocidad y calidad). \n INTER_CUBIC: interpolación bicúbica (mayor calidad, pero más lenta). \n INTER_LANCZOS4: interpolación Lanczos (mejor calidad al ampliar). \n
Ejemplo de ampliación de imagen al doble con interpolación bicúbica:
\n#include <opencv2/opencv.hpp>\n#include <iostream>\n\nint main() {\n cv::Mat src = cv::imread("input.jpg");\n if (src.empty()) {\n std::cerr << "No se pudo cargar la imagen" << std::endl;\n return -1;\n }\n\n cv::Mat dst;\n cv::resize(src, dst, cv::Size(), 2.0, 2.0, cv::INTER_CUBIC);\n\n cv::imwrite("output_resized.jpg", dst);\n std::cout << "Imagen ampliada y guardada" << std::endl;\n return 0;\n}\n\nRecorte de imagen (crop)
\nEn OpenCV no existe una función separada para recortar. En su lugar, se utiliza el mecanismo de Región de Interés (ROI): la selección de un área rectangular en la imagen. Esto se realiza mediante el operador () o el método cv::Mat::operator().
Sintaxis de recorte
También en la biblioteca
Trabajo con Apache Kafka en C++: librería librdkafka y ejemplos prácticos
Combine para Swift: guía completa con ejemplos
FastEndpoints C# (.NET): guía completa con ejemplos prácticos
Framework CLI para JavaScript (Node.js): Commander.js – creación de aplicaciones de consola