Processamento de Imagens em C++: resize e crop com a biblioteca OpenCV

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com imagens: resize e crop em C++ com OpenCV

\n\n

No 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\n

Biblioteca OpenCV — o padrão de facto para trabalhar com imagens em C++

\n\n

OpenCV (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\n

Principais 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
\n\n

Instalação do OpenCV para C++

\n

Para 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:

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install opencv4
\n\n

Após a instalação, conecte a biblioteca no seu CMakeLists.txt:

\n
find_package(OpenCV REQUIRED)\ntarget_link_libraries(your_project ${OpenCV_LIBS})
\n\n

Redimensionamento de imagem (resize)

\n

A função cv::resize() permite alterar as dimensões da imagem original para uma largura e altura especificadas. Sintaxe:

\n
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\n

O parâmetro interpolation define o algoritmo usado para calcular os novos pixels. Principais opções:

\n
    \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
\n\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\n

Corte de imagem (crop)

\n

No 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().

\n\n

Sintaxe do corte

Recommendations