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