Trabalhando com imagens: resize e crop em C++ com OpenCV
\n\nNo desenvolvimento moderno de aplicações, especialmente na área de visão computacional, web scraping ou processamento de arquivos de mídia, surge frequentemente a necessidade de redimensionar (resize) e cortar (crop) imagens programaticamente. A linguagem C++ combinada com a poderosa biblioteca OpenCV fornece todas as ferramentas necessárias para isso. Neste artigo, vamos detalhar como realizar essas operações, quais parâmetros afetam a qualidade do resultado e apresentar exemplos de código prontos.
\n\nBiblioteca OpenCV — o padrão de facto para trabalhar com imagens em C++
\n\nOpenCV (Open Source Computer Vision Library) é uma biblioteca multiplataforma de código aberto que contém centenas de algoritmos otimizados para processamento de imagens e vídeos. Ela é escrita em C++ e possui interfaces para Python, Java e outras linguagens. Para C++, o OpenCV é a solução mais performática e funcional.
\n\nPrincipais vantagens do OpenCV para tarefas de resize e crop:
\n- \n
- Alta velocidade — todas as funções utilizam instruções SIMD e multithreading. \n
- Flexibilidade — suporte a diversos métodos de interpolação (bilinear, bicúbica, Lanczos, etc.). \n
- Praticidade — trabalho com imagens através da classe
cv::Mat, que gerencia a memória automaticamente. \n
Instalação do OpenCV para C++
\nPara começar, é necessário instalar a biblioteca. A forma mais comum é através do gerenciador de pacotes vcpkg ou compilando a partir do código fonte. Exemplo de instalação via vcpkg:
\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install opencv4\n\nApós a instalação, conecte a biblioteca no seu CMakeLists.txt:
\nfind_package(OpenCV REQUIRED)\ntarget_link_libraries(your_project ${OpenCV_LIBS})\n\nRedimensionamento de imagem (resize)
\nA função cv::resize() permite alterar as dimensões da imagem original para uma largura e altura especificadas. Sintaxe:
cv::resize(\n InputArray src, // imagem original\n OutputArray dst, // imagem resultante\n Size dsize, // novo tamanho (largura, altura)\n double fx = 0, // escala em X (se dsize não for definido)\n double fy = 0, // escala em Y\n int interpolation = INTER_LINEAR // método de interpolação\n);\n\nO parâmetro interpolation define o algoritmo usado para calcular os novos pixels. Principais opções:
- \n
INTER_NEAREST— método do vizinho mais próximo (rápido, mas baixa qualidade). \n INTER_LINEAR— interpolação bilinear (bom equilíbrio entre velocidade e qualidade). \n INTER_CUBIC— interpolação bicúbica (mais qualidade, porém mais lenta). \n INTER_LANCZOS4— interpolação Lanczos (melhor qualidade ao ampliar). \n
Exemplo de ampliação da imagem em 2 vezes com interpolação 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 << "Não foi possível carregar a imagem" << 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 << "Imagem ampliada e salva" << std::endl;\n return 0;\n}\n\nCorte de imagem (crop)
\nNo OpenCV não existe uma função separada para corte. Em vez disso, utiliza-se o mecanismo Region of Interest (ROI) — seleção de uma área retangular na imagem. Isso é feito com o operador () ou o método cv::Mat::operator().
Sintaxe do corte
Também na biblioteca
Tokens JWT em C# (.NET): guia completo com exemplos
Trabalhando com Excel em Swift: Guia Completo de Bibliotecas e Ferramentas para iOS/macOS