Reconhecimento de Imagens em C#

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima