O processamento de imagens e a visão computacional são áreas que têm ganhado grande relevância em aplicações modernas, como segurança, automação industrial e análise de vídeos. No ecossistema C#, uma das bibliotecas mais populares para esse tipo de tarefa é a Emgu.CV.
O que é a Emgu.CV?
A OpenCV (Open Source Computer Vision Library) é uma biblioteca de código aberto amplamente utilizada para processamento de imagens e visão computacional. Ela fornece diversas funcionalidades para análise de imagens, detecção de objetos, reconhecimento facial, manipulação de vídeos, aprendizado de máquina e muito mais. Foi escrita principalmente em C++ e possui bindings para outras linguagens, como Python, Java e C#.
O Emgu CV é um wrapper para a OpenCV que permite que desenvolvedores usem a OpenCV no ambiente .NET (C#, VB.NET, F#). Ele encapsula as funcionalidades da OpenCV em classes e métodos que podem ser utilizados diretamente no C#.
Um wrapper é uma camada de abstração que envolve outra biblioteca ou código para facilitar seu uso em diferentes linguagens ou ambientes. O Emgu CV é um wrapper porque:
- Fornece bindings para OpenCV: Ele expõe as funções da OpenCV de forma mais amigável para o ambiente .NET, tornando o uso da biblioteca mais intuitivo
- Ele usa a OpenCV como base: O Emgu CV não implementa algoritmos de visão computacional por conta própria, mas apenas disponibiliza os da OpenCV para serem usados no .NET.
- Facilita a interoperabilidade: A OpenCV é escrita em C++, e o Emgu CV fornece um meio de usá-la em C# e .NET sem precisar escrever código em C++ diretamente.
- Gerencia ponteiros e chamadas nativas: Como a OpenCV usa ponteiros e estruturas de dados de baixo nível, o Emgu CV converte esses elementos para objetos gerenciados do .NET.
Principais funcionalidades da Emgu.CV
A biblioteca oferece diversas funcionalidades, incluindo:
- Processamento de imagens: Aplicação de filtros, detecção de bordas, transformação de cores, entre outros.
- Detecção de objetos e reconhecimento facial: Algoritmos como Haar Cascade e redes neurais para identificação de rostos.
- Processamento de vídeo em tempo real: Captura de vídeo de webcams e câmeras IP.
- Reconhecimento de padrões: Identificação de formas, leitura de códigos de barras e OCR (Optical Character Recognition).
- Integração com aprendizado de máquina: Possibilidade de usar modelos treinados para reconhecimento avançado de imagens.
Aplicando Emgu.CV para reconhecimento facial em vídeos
Uma das aplicações mais comuns da Emgu.CV é o reconhecimento facial em tempo real. Com apenas algumas linhas de código, é possível detectar rostos em um fluxo de vídeo ao vivo capturado pela webcam.
No próximo post, veremos um exemplo prático em C# que demonstra como identificar faces em um vídeo ao vivo utilizando Emgu.CV.
Se você deseja iniciar com visão computacional no C#, a Emgu.CV é uma excelente escolha, pois combina a robustez do OpenCV com a facilidade de desenvolvimento no ecossistema .NET.
Exemplo de Reconhecimento Facial em C#
Requisitos:
- Visual Studio 2022 com .Net Core 8 instalado
- Câmera de pelo menos 720p (abaixo pode não ter resolução suficiente)
- Biblioteca Emgu.CV (Baixar via Nuget)
- Download de um modelo já treinado de reconhecimento facial
Passo a Passo:
- Criação de um projeto WPF dentro do Visual Studio 2022

- Instalação dos Pacotes Emgu.CV e Emgu.CV.runtime.windows

- Fazer download neste link do arquivo haarcascade_frontalface_default.xml . O arquivo é um classificador em cascata baseado no algoritmo Haar Cascade para detecção de rostos frontais. Ele faz parte dos modelos pré-treinados fornecidos pelo OpenCV e é amplamente utilizado para reconhecimento facial em aplicações de visão computacional.
- Colar o código abaixo em C#
Arquivo XAML
<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Reconhecimento de Face em C#" Width="800" Height="450" Closing="MainWindow_OnClosing" mc:Ignorable="d"> <Grid> <Image x:Name="cameraImage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> </Grid> </Window>
Arquivo Cs
using Emgu.CV; using Emgu.CV.Structure; using System.Drawing; using System.Windows; using System.Windows.Interop; using System.Windows.Media.Imaging; using System.Windows.Threading; namespace WpfApp2 { public partial class MainWindow : Window { private VideoCapture capture; private CascadeClassifier faceCascade; private bool isRunning = false; private DispatcherTimer timer; public MainWindow() { InitializeComponent(); try { // Inicializa a captura de vídeo (câmera padrão) capture = new VideoCapture(); // Carrega o classificador Haar Cascade para detecção facial faceCascade = new CascadeClassifier("haarcascade_frontalface_default.xml"); // Certifique-se de ter o arquivo XML // Inicializa o timer para atualizar a imagem timer = new DispatcherTimer(); timer.Tick += ProcessFrame; timer.Interval = TimeSpan.FromMilliseconds(30); // Ajuste conforme necessário timer.Start(); isRunning = true; } catch (Exception ex) { MessageBox.Show($"Erro ao inicializar: {ex.Message}"); } } private void ProcessFrame(object sender, EventArgs e) { if (!isRunning) return; try { Mat frame = capture.QueryFrame(); if (frame == null) return; Image<Bgr, byte> image = frame.ToImage<Bgr, byte>(); // Detecta rostos na imagem Rectangle[] faces = faceCascade.DetectMultiScale( image, 1.1, 10, System.Drawing.Size.Empty); // Desenha retângulos verdes ao redor dos rostos detectados foreach (Rectangle face in faces) { image.Draw(face, new Bgr(Color.Green), 2); } // Converte a imagem para um formato que WPF pode exibir Bitmap bitmap = new Bitmap(frame.Width, frame.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, frame.Width, frame.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); int imageSize = frame.Width * frame.Height * 3; // 3 bytes por pixel (B, G, R) byte[] data = new byte[imageSize]; System.Runtime.InteropServices.Marshal.Copy(image.MIplImage.ImageData, data, 0, imageSize); System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapData.Scan0, imageSize); bitmap.UnlockBits(bitmapData); var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // Exibe a imagem no controle Image da WPF cameraImage.Source = bitmapSource; } catch (Exception ex) { MessageBox.Show($"Erro ao processar frame: {ex.Message}"); StopCapture(); // Para a captura em caso de erro } } private void StopCapture() { if (timer != null) { timer.Stop(); timer = null; } if (capture != null) { capture.Stop(); capture.Dispose(); capture = null; } if (faceCascade != null) { faceCascade.Dispose(); faceCascade = null; } isRunning = false; } private void MainWindow_OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { StopCapture(); } } }
Abaixo uma imagem de teste da aplicação funcionando, reconhecendo meu rosto e deixando dentro de um quadro verde

Haar Cascade
O arquivo haarcascade_frontalface_default.xml é um classificador em cascata baseado no algoritmo Haar Cascade para detecção de rostos frontais. Ele faz parte dos modelos pré-treinados fornecidos pelo OpenCV e é amplamente utilizado para reconhecimento facial em aplicações de visão computacional.
Como Funciona?
O algoritmo Haar Cascade foi desenvolvido por Paul Viola e Michael Jones e funciona através de um treinamento com milhares de imagens positivas (com rostos) e negativas (sem rostos). Ele utiliza janelas deslizantes para analisar diferentes partes da imagem e identificar padrões que correspondam a um rosto.
O modelo treinado é armazenado no formato XML, contendo os coeficientes necessários para a detecção.
Dentro deste link temos diversos modelos pré treinados, e pode ser encontrados diversos, como por exemplo modelos que avaliam não somente rosto mas corpo todo, se está ou não de óculos, uso de máscara ,etc
Views: 9