Trabalhando com Imagens em C++: Visão Geral das Bibliotecas e Exemplos Práticos
O processamento de imagens é uma das tarefas-chave na programação moderna, desde a visão computacional até editores gráficos. Em C++, existem várias bibliotecas poderosas que permitem carregar, processar e salvar imagens. Neste artigo, vamos explorar três ferramentas populares: CImg, OpenCV e stb_image. Cada uma delas possui suas próprias características, vantagens e áreas de aplicação.
1. Biblioteca CImg
CImg (C++ Image Processing Library) é uma biblioteca leve e multiplataforma para processamento de imagens. Ela é distribuída como um único arquivo de cabeçalho (CImg.h), o que a torna ideal para prototipagem rápida e projetos pequenos. O CImg suporta formatos BMP, JPEG, PNG, TIFF e outros, mas para trabalhar com eles requer a instalação de bibliotecas adicionais (por exemplo, libpng ou libjpeg).
Principais recursos:
- Carregamento, exibição e salvamento de imagens.
- Filtros (desfoque, nitidez, filtro mediano).
- Transformações geométricas (rotação, redimensionamento, espelhamento).
- Trabalho com espaços de cores (RGB, HSV, Lab).
- Desenho de primitivas (linhas, círculos, texto).
Exemplo: carregar uma imagem e aplicar desfoque
#include "CImg.h"using namespace cimg_library;
int main() { // Carregamos a imagem CImg<unsigned char> image("input.jpg");
// Aplicamos desfoque Gaussiano (raio 3) CImg<unsigned char> blurred = image.get_blur(3);
// Salvamos o resultado blurred.save("output_blurred.jpg");
return 0;}Este código demonstra a abordagem minimalista do CImg: uma linha para carregar, uma para processar e uma para salvar. A biblioteca gerencia a memória automaticamente.
2. Biblioteca OpenCV
OpenCV (Open Source Computer Vision Library) é o padrão de facto para tarefas de visão computacional e processamento de imagens em C++. Ela inclui mais de 2500 algoritmos otimizados, suporta aceleração por GPU e é amplamente utilizada em soluções industriais, robótica e pesquisa científica. O OpenCV trabalha com formatos JPEG, PNG, TIFF, WebP e muitos outros.
Principais recursos:
- Carregamento, exibição e gravação de vídeo/imagens.
- Filtragem, morfologia, processamento por limiar.
- Detecção de objetos (rostos, carros) usando cascatas Haar ou aprendizado profundo.
- Calibração de câmera, visão estéreo.
- Aprendizado de máquina (SVM, KNN, redes neurais).
Exemplo: redimensionar e converter para tons de cinza
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // Carregamos a imagem colorida Mat image = imread("input.jpg", IMREAD_COLOR); if (image.empty()) { return -1; }
// Convertemos para tons de cinza Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY);
// Reduzimos o tamanho pela metade Mat resized; resize(gray, resized, Size(), 0.5, 0.5, INTER_LINEAR);
// Salvamos o resultado imwrite("output_gray_resized.jpg", resized);
return 0;}O OpenCV usa a classe Mat para representar imagens. Todas as operações são realizadas através de funções estáticas ou métodos. A biblioteca requer instalação prévia, mas oferece máxima flexibilidade e desempenho.
3. Biblioteca stb_image
stb_image faz parte de um conjunto de bibliotecas de cabeçalho único de Sean Barrett. Ela é destinada exclusivamente ao carregamento e salvamento de imagens, sem funções de processamento. Suporta os formatos JPEG, PNG, BMP, GIF, PS
Também na biblioteca
Trabalhando com Excel em Go (Golang): bibliotecas Excelize, xlsx, tealeg
GameplayKit para Swift: guia completo com exemplos práticos
Geração de relatórios PDF em Go: visão geral das bibliotecas e exemplos de código
Trabalhando com Apache Kafka em C++: bibliotecas e exemplos
MetricsKit — monitoramento de aplicativos Swift em iOS/macOS