Implementación de Detección de Rostros en Aplicaciones de Video .NET¶
Introducción a la Tecnología de Detección de Rostros¶
La detección de rostros es una tecnología de visión por computadora que identifica y localiza rostros humanos dentro de imágenes digitales o cuadros de video. A diferencia del reconocimiento facial (que identifica a individuos específicos), la detección de rostros simplemente responde a la pregunta: "¿Hay un rostro en esta imagen y, de ser así, dónde se encuentra?"
Esta tecnología sirve como base para numerosas aplicaciones:
- Sistemas de seguridad y vigilancia
- Aplicaciones de fotografía (enfoque automático, reducción de ojos rojos)
- Redes sociales (sugerencias de etiquetado, filtros)
- Análisis de emociones e investigación de experiencia de usuario
- Sistemas de seguimiento de asistencia
- Mejoras en videoconferencias
Para los desarrolladores que construyen aplicaciones .NET, implementar la detección de rostros puede agregar un valor significativo a las aplicaciones de captura y procesamiento de video. Esta guía proporciona un recorrido completo para implementar la detección de rostros en sus proyectos .NET.
Comenzando con la Detección de Rostros en .NET¶
Requisitos Previos¶
Antes de implementar la detección de rostros en su aplicación, asegúrese de tener:
- Visual Studio (se recomienda 2019 o más reciente)
- .NET Framework 4.6.2+ o .NET Core 3.1+/.NET 5+
- Comprensión básica de C# y programación orientada a eventos
- Administrador de paquetes NuGet
- Redistribuibles requeridos (detallados más adelante en este documento)
Descripción General de la Implementación¶
El proceso de implementación sigue estos pasos clave:
- Configurar su fuente de video
- Configurar los parámetros de seguimiento de rostros
- Crear y registrar manejadores de eventos para la detección de rostros
- Procesar los resultados de la detección
- Iniciar el flujo de video
Desglosemos cada uno de estos pasos con ejemplos de código detallados.
Paso 1: Configurar Su Fuente de Video¶
El seguimiento de rostros corre sobre la fuente a la que esté enlazada la instancia VideoCaptureCore. Elige una de las siguientes configuraciones:
VideoCapture1.Mode = VideoCaptureMode.VideoPreview;
VideoCapture1.Video_CaptureDevice = new VideoCaptureSource("USB Camera");
VideoCapture1.Video_CaptureDevice.Format_UseBest = true;
VideoCapture1.Mode = VideoCaptureMode.IPPreview;
VideoCapture1.IP_Camera_Source = new IPCameraSourceSettings
{
URL = new Uri("rtsp://camera.local:554/stream"),
Type = IPSourceEngine.Auto_VLC,
Login = "admin",
Password = "password"
};
Para detección de rostros offline en archivos, usa MediaPlayerCore del Media Player SDK — la propiedad Face_Tracking se comporta igual en todos los motores. El resto de esta guía (Pasos 2–5) sigue aplicando; reemplaza VideoCapture1 por tu instancia MediaPlayer1.
Elige un patrón y continúa con el Paso 2 para habilitar el seguimiento de rostros en esa fuente.
Paso 2: Configurar Ajustes de Seguimiento de Rostros¶
Con su fuente de video configurada, el siguiente paso es configurar los parámetros de detección de rostros. Estos ajustes determinan cómo el SDK identifica y rastrea los rostros:
VideoCapture1.Face_Tracking = new FaceTrackingSettings
{
// Color mode determines how colors are processed for detection
ColorMode = CamshiftMode.RGB,
// Highlight detected faces in the preview
Highlight = true,
// Minimum size (in pixels) of face to detect
MinimumWindowSize = 25,
// Scanning approach - how the algorithm scales through the image
ScalingMode = ObjectDetectorScalingMode.GreaterToSmaller,
// Single or multiple face detection
SearchMode = ObjectDetectorSearchMode.Single,
// Factor de escala para recorrer la pirámide (1.0 < factor <= 2.0)
ScaleFactor = 1.2f
};
Entendiendo los Parámetros de Seguimiento de Rostros¶
- ColorMode (
CamshiftMode): Determina cómo el algoritmo procesa los colores para la detección - RGB: Procesamiento de color RGB estándar
- HSL: Espacio de color Matiz-Saturación-Luminosidad, puede ser más robusto en iluminación variable
-
Mixed: Combina canales RGB y HSL
-
ScalingMode: Controla cómo el algoritmo busca a través de diferentes escalas
- GreaterToSmaller: Comienza con rostros potenciales más grandes y trabaja hacia abajo
-
SmallerToGreater: Comienza con rostros potenciales más pequeños y trabaja hacia arriba
-
SearchMode: Determina si buscar uno o varios rostros
- Single: Optimizado para encontrar un rostro (más rápido)
-
Multiple: Diseñado para encontrar todos los rostros en el cuadro (más intensivo en procesamiento)
-
MinimumWindowSize: El tamaño de rostro más pequeño (en píxeles) que se detectará
- Valores más pequeños capturan rostros distantes pero aumentan los falsos positivos
- Valores más grandes son más confiables pero pueden perder rostros más pequeños/distantes
Paso 3: Configurar el Manejo de Eventos de Detección de Rostros¶
Para responder a los rostros detectados, necesita crear un manejador de eventos y registrarlo con el SDK:
// OnFaceDetected es un EventHandler<AFFaceDetectionEventArgs> estándar.
// e.FaceRectangles es un Rectangle[] — use .Length, no .Count.
private void OnFaceDetectedHandler(object sender, AFFaceDetectionEventArgs e)
{
// Limpiar texto previo
edFaceTrackingFaces.Text = string.Empty;
// Procesar cada rostro detectado
foreach (var faceRectangle in e.FaceRectangles)
{
// Mostrar coordenadas y dimensiones del rostro
edFaceTrackingFaces.Text +=
$"Position: ({faceRectangle.Left}, {faceRectangle.Top}), " +
$"Size: ({faceRectangle.Width}, {faceRectangle.Height}){Environment.NewLine}";
// También puede calcular el punto central
int centerX = faceRectangle.Left + (faceRectangle.Width / 2);
int centerY = faceRectangle.Top + (faceRectangle.Height / 2);
edFaceTrackingFaces.Text += $"Center: ({centerX}, {centerY}){Environment.NewLine}";
// Opcional: añadir marca de tiempo para seguimiento
edFaceTrackingFaces.Text += $"Time: {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{Environment.NewLine}";
}
// Actualizar conteo de rostros (Rectangle[] — Length, no Count)
lblFaceCount.Text = $"Faces detected: {e.FaceRectangles.Length}";
}
// Registrar el manejador de eventos
VideoCapture1.OnFaceDetected += OnFaceDetectedHandler;
Este manejador de eventos proporciona actualizaciones en tiempo real cada vez que se detectan rostros. El manejador recibe coordenadas de rostros que puede usar para:
- Mostrar indicadores visuales
- Rastrear el movimiento del rostro a lo largo del tiempo
- Activar acciones basadas en la posición del rostro
- Registrar datos de detección
Paso 4: Procesamiento de Resultados de Detección¶
Con el manejador de eventos en su lugar, puede procesar los resultados de la detección. Algunas tareas de procesamiento comunes incluyen:
Visualización de Rostros Detectados¶
Más allá del resaltado incorporado, es posible que desee implementar visualizaciones personalizadas:
// Custom visualization - draw face rectangles on an overlay
private void DrawFacesOnOverlay(Rectangle[] faceRectangles, PictureBox overlay)
{
// Create bitmap for overlay
Bitmap overlayBitmap = new Bitmap(overlay.Width, overlay.Height);
using (Graphics g = Graphics.FromImage(overlayBitmap))
{
g.Clear(Color.Transparent);
// Draw each face
foreach (var face in faceRectangles)
{
// Draw rectangle
g.DrawRectangle(new Pen(Color.GreenYellow, 2), face);
// Optional: Draw crosshair at center
int centerX = face.Left + (face.Width / 2);
int centerY = face.Top + (face.Height / 2);
g.DrawLine(new Pen(Color.Red, 1), centerX - 10, centerY, centerX + 10, centerY);
g.DrawLine(new Pen(Color.Red, 1), centerX, centerY - 10, centerX, centerY + 10);
}
}
// Update overlay
overlay.Image = overlayBitmap;
}
Implementación de Lógica de Seguimiento de Rostros¶
Para aplicaciones más avanzadas, es posible que desee rastrear rostros a lo largo del tiempo:
private Dictionary<int, TrackedFace> trackedFaces = new Dictionary<int, TrackedFace>();
private int nextFaceId = 1;
private void TrackFaces(List<Rectangle> currentFaces)
{
// Match current faces with previously tracked faces
List<int> matchedIds = new List<int>();
List<Rectangle> unmatchedFaces = new List<Rectangle>(currentFaces);
foreach (var trackedFace in trackedFaces.Values.ToList())
{
bool foundMatch = false;
for (int i = unmatchedFaces.Count - 1; i >= 0; i--)
{
if (IsLikelyMatch(trackedFace.LastLocation, unmatchedFaces[i]))
{
// Update existing tracked face
trackedFace.UpdateLocation(unmatchedFaces[i]);
matchedIds.Add(trackedFace.Id);
unmatchedFaces.RemoveAt(i);
foundMatch = true;
break;
}
}
// Remove faces that disappeared
if (!foundMatch)
{
trackedFaces.Remove(trackedFace.Id);
}
}
// Add new faces
foreach (var newFace in unmatchedFaces)
{
trackedFaces.Add(nextFaceId, new TrackedFace(nextFaceId, newFace));
nextFaceId++;
}
}
private bool IsLikelyMatch(Rectangle previous, Rectangle current)
{
// Calculate center points
Point prevCenter = new Point(
previous.Left + previous.Width / 2,
previous.Top + previous.Height / 2);
Point currCenter = new Point(
current.Left + current.Width / 2,
current.Top + current.Height / 2);
// Calculate distance between centers
double distance = Math.Sqrt(
Math.Pow(prevCenter.X - currCenter.X, 2) +
Math.Pow(prevCenter.Y - currCenter.Y, 2));
// If centers are close enough, consider it the same face
return distance < Math.Max(previous.Width, current.Width) * 0.5;
}
// Simple class to track face data
private class TrackedFace
{
public int Id { get; private set; }
public Rectangle LastLocation { get; private set; }
public DateTime FirstSeen { get; private set; }
public DateTime LastSeen { get; private set; }
public TrackedFace(int id, Rectangle location)
{
Id = id;
LastLocation = location;
FirstSeen = DateTime.Now;
LastSeen = DateTime.Now;
}
public void UpdateLocation(Rectangle newLocation)
{
LastLocation = newLocation;
LastSeen = DateTime.Now;
}
}
Paso 5: Iniciar Flujo de Video y Detección de Rostros¶
El paso final es iniciar el flujo de video y el proceso de detección de rostros:
// Start video capture asynchronously
await VideoCapture1.StartAsync();
Si necesita detener el proceso:
// Stop video capture
await VideoCapture1.StopAsync();
Dependencias Requeridas¶
Para asegurarse de que su aplicación funcione correctamente, deberá incluir los paquetes redistribuibles apropiados:
- Redistribuibles de captura de video:
- Versión x86
- Versión x64
Instale estos paquetes a través de NuGet:
Install-Package VisioForge.DotNet.Core.Redist.VideoCapture.x64
O para proyectos x86:
Install-Package VisioForge.DotNet.Core.Redist.VideoCapture.x86
Conclusión¶
La implementación de la detección de rostros en sus aplicaciones .NET mejora sus capacidades y abre numerosas posibilidades para la interacción del usuario, características de seguridad y automatización. Siguiendo esta guía, ahora tiene el conocimiento para integrar una detección de rostros robusta en sus aplicaciones de captura de video.
Para recursos adicionales y más ejemplos de código, visite nuestro repositorio de GitHub.