Documentación de la API .NET del SDK de Video Fingerprinting¶
Descripción General¶
El espacio de nombres VisioForge Video Fingerprinting proporciona una funcionalidad potente para la identificación de contenido de video, comparación y operaciones de búsqueda. Permite a las aplicaciones:
- Generar huellas digitales únicas a partir de archivos de video para la identificación de contenido
- Comparar videos para determinar similitud y detectar duplicados
- Buscar fragmentos de video dentro de videos más grandes (por ejemplo, encontrar comerciales, introducciones o escenas específicas)
- Comparar imágenes individuales para la detección de similitud (solo Windows)
- Procesar cuadros de video directamente para generar huellas digitales a partir de transmisiones o contenido generado
Tabla de Contenidos¶
- Clase VFPAnalyzer
- Clase VFPFingerPrint
- Clase VFPFingerprintSource
- Clase VFPCompare
- Clase VFPSearch
- Clase VFPFingerPrintDB
- Clase VFPFingerprintFromFrames
- Tipos de Soporte
- Delegados
Clase VFPAnalyzer¶
El punto de entrada principal para las operaciones de huellas digitales de video, proporcionando métodos estáticos de alto nivel para análisis, comparación y búsqueda.
Propiedades¶
DebugDir¶
Descripción: Ruta del directorio para la salida de depuración. Cuando se establece, los resultados intermedios del procesamiento pueden guardarse para la resolución de problemas.
Predeterminado: null (salida de depuración deshabilitada)
Ejemplo:
// Habilitar salida de depuración
VFPAnalyzer.DebugDir = @"C:\Temp\VFP_Debug";
// Deshabilitar salida de depuración
VFPAnalyzer.DebugDir = null;
Métodos¶
SetLicenseKey¶
Descripción: Establece la clave de licencia para el SDK de Video Fingerprinting. Debe llamarse antes de usar cualquier función de huellas digitales.
Parámetros:
vfpLicense(string): Su clave de licencia de VisioForge
Ejemplo:
// Establecer clave de licencia al inicio de la aplicación
VFPAnalyzer.SetLicenseKey("YOUR-LICENSE-KEY-HERE");
GetComparingFingerprintForVideoFileAsync¶
public static async Task<VFPFingerPrint> GetComparingFingerprintForVideoFileAsync(
VFPFingerprintSource source,
VFPErrorCallback errorDelegate = null,
VFPProgressCallback progressDelegate = null)
Descripción: Genera una huella digital optimizada para operaciones de comparación de video completo.
Parámetros:
source(VFPFingerprintSource): Configuración de la fuente de video que incluye ruta de archivo, rango de tiempo y opciones de procesamientoerrorDelegate(VFPErrorCallback): Callback opcional para mensajes de errorprogressDelegate(VFPProgressCallback): Callback opcional para actualizaciones de progreso (0-100)
Devuelve: Task<VFPFingerPrint> - Huella digital generada o null si ocurrió un error
Caso de Uso: Comparar videos completos o segmentos grandes para determinar la similitud general
Ejemplo:
// Uso básico
var source = new VFPFingerprintSource(@"C:\Videos\movie.mp4");
var fingerprint = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
if (fingerprint != null)
{
fingerprint.Save(@"C:\Fingerprints\movie.vsigx");
Console.WriteLine($"Fingerprint created for {fingerprint.Duration} duration");
}
// Con manejo de errores y reporte de progreso
var source2 = new VFPFingerprintSource(@"C:\Videos\video.mp4")
{
StartTime = TimeSpan.FromMinutes(5),
StopTime = TimeSpan.FromMinutes(10)
};
var fingerprint2 = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(
source2,
error => Console.WriteLine($"Error: {error}"),
progress => Console.WriteLine($"Progress: {progress}%"));
// Con áreas ignoradas (por ejemplo, logotipos, marcas de agua)
var source3 = new VFPFingerprintSource(@"C:\Videos\broadcast.mp4");
source3.IgnoredAreas.Add(new Rect(1700, 50, 1870, 150)); // Logotipo superior derecho
source3.IgnoredAreas.Add(new Rect(100, 950, 300, 1000)); // Marca de tiempo inferior
var fingerprint3 = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source3);
GetSearchFingerprintForVideoFileAsync¶
public static async Task<VFPFingerPrint> GetSearchFingerprintForVideoFileAsync(
VFPFingerprintSource source,
VFPErrorCallback errorDelegate = null,
VFPProgressCallback progressDelegate = null)
Descripción: Genera una huella digital optimizada para operaciones de búsqueda de fragmentos.
Parámetros:
source(VFPFingerprintSource): Configuración de la fuente de videoerrorDelegate(VFPErrorCallback): Callback de error opcionalprogressDelegate(VFPProgressCallback): Callback de progreso opcional
Devuelve: Task<VFPFingerPrint> - Huella digital generada o null si ocurrió un error
Caso de Uso: Crear huellas digitales de clips cortos para localizar dentro de videos de larga duración
Ejemplo:
// Crear huella digital para un comercial
var commercialSource = new VFPFingerprintSource(@"C:\Videos\commercial.mp4");
var commercialFp = await VFPAnalyzer.GetSearchFingerprintForVideoFileAsync(
commercialSource,
error => Console.WriteLine($"Error: {error}"),
progress => Console.WriteLine($"Processing: {progress}%"));
// Crear huella digital para una escena específica
var sceneSource = new VFPFingerprintSource(@"C:\Videos\movie.mp4")
{
StartTime = TimeSpan.FromMinutes(42),
StopTime = TimeSpan.FromMinutes(43)
};
var sceneFp = await VFPAnalyzer.GetSearchFingerprintForVideoFileAsync(sceneSource);
if (sceneFp != null)
{
sceneFp.Tag = "Action scene at bridge";
sceneFp.Save(@"C:\Fingerprints\scene.vsigx");
}
Compare¶
Descripción: Compara dos huellas digitales de video para determinar la similitud.
Parámetros:
fp1(VFPFingerPrint): Primera huella digitalfp2(VFPFingerPrint): Segunda huella digitalshift(TimeSpan): Desplazamiento de tiempo máximo permitido durante la comparación
Devuelve: int - Puntuación de diferencia (menor = más similar), o Int32.MaxValue si alguna huella digital es nula
Ejemplo:
// Cargar dos huellas digitales
var fp1 = VFPFingerPrint.Load(@"C:\Fingerprints\video1.vsigx");
var fp2 = VFPFingerPrint.Load(@"C:\Fingerprints\video2.vsigx");
// Comparar con tolerancia de desplazamiento de 5 segundos
int difference = VFPAnalyzer.Compare(fp1, fp2, TimeSpan.FromSeconds(5));
// Interpretar resultados
if (difference < 5)
{
Console.WriteLine("Videos are nearly identical");
}
else if (difference < 15)
{
Console.WriteLine("Videos are very similar");
}
else if (difference < 30)
{
Console.WriteLine("Videos have similar content with differences");
}
else if (difference < 100)
{
Console.WriteLine("Videos are related but significantly different");
}
else
{
Console.WriteLine("Videos are completely different");
}
// Comparación por lotes
var fingerprints = new List<VFPFingerPrint>();
foreach (var file in Directory.GetFiles(@"C:\Fingerprints", "*.vsigx"))
{
fingerprints.Add(VFPFingerPrint.Load(file));
}
var referenceFp = fingerprints[0];
foreach (var fp in fingerprints.Skip(1))
{
int diff = VFPAnalyzer.Compare(referenceFp, fp, TimeSpan.FromSeconds(3));
Console.WriteLine($"{fp.OriginalFilename}: Difference = {diff}");
}
Search / SearchAsync¶
public static List<TimeSpan> Search(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
TimeSpan duration,
int maxDifference,
bool allowMultipleFragments)
public static Task<List<TimeSpan>> SearchAsync(
VFPFingerPrint fp1,
VFPFingerPrint fp2,
TimeSpan duration,
int maxDifference,
bool allowMultipleFragments)
Descripción: Busca ocurrencias de un fragmento de video dentro de un video más grande.
Parámetros:
fp1(VFPFingerPrint): Huella digital del fragmento (aguja)fp2(VFPFingerPrint): Video en el que buscar (pajar)duration(TimeSpan): Duración del fragmento (evita coincidencias superpuestas)maxDifference(int): Diferencia máxima permitida (típico: 5-20)allowMultipleFragments(bool): Encontrar todas las ocurrencias vs. solo la primera coincidencia
Devuelve: List<TimeSpan> - Marcas de tiempo donde se encontraron coincidencias
Ejemplo:
// Buscar un comercial en una grabación
var commercialFp = VFPFingerPrint.Load(@"C:\Fingerprints\commercial.vsigx");
var recordingFp = VFPFingerPrint.Load(@"C:\Fingerprints\tv_recording.vsigx");
// Encontrar todas las ocurrencias
var matches = await VFPAnalyzer.SearchAsync(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30), // Duración del comercial
maxDifference: 10,
allowMultipleFragments: true);
foreach (var timestamp in matches)
{
Console.WriteLine($"Commercial found at: {timestamp:hh\\:mm\\:ss}");
}
// Encontrar solo la primera ocurrencia
var firstMatch = VFPAnalyzer.Search(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30),
maxDifference: 15,
allowMultipleFragments: false);
if (firstMatch.Any())
{
Console.WriteLine($"First occurrence at: {firstMatch[0]}");
}
// Buscar con coincidencia más estricta
var exactMatches = VFPAnalyzer.Search(
commercialFp,
recordingFp,
TimeSpan.FromSeconds(30),
maxDifference: 5, // Muy estricto
allowMultipleFragments: true);
CompareVideoFilesAsync¶
public static async Task<bool> CompareVideoFilesAsync(
VFPFingerprintSource file1,
VFPFingerprintSource file2,
TimeSpan shift,
VFPErrorCallback errorCallback,
int threshold = 500)
Descripción: Método de conveniencia que genera huellas digitales y compara dos archivos de video en una sola operación.
Parámetros:
file1(VFPFingerprintSource): Configuración del primer videofile2(VFPFingerprintSource): Configuración del segundo videoshift(TimeSpan): Desplazamiento de tiempo máximo permitidoerrorCallback(VFPErrorCallback): Callback de errorthreshold(int): Diferencia máxima para considerar como coincidencia (predeterminado: 500)
Devuelve: Task<bool> - true si los videos coinciden (diferencia < umbral), de lo contrario false
Ejemplo:
// Comparar dos archivos de video directamente
var file1 = new VFPFingerprintSource(@"C:\Videos\original.mp4");
var file2 = new VFPFingerprintSource(@"C:\Videos\copy.mp4");
bool areIdentical = await VFPAnalyzer.CompareVideoFilesAsync(
file1,
file2,
TimeSpan.FromSeconds(5),
error => Console.WriteLine($"Error: {error}"),
threshold: 20);
if (areIdentical)
{
Console.WriteLine("Videos are identical or very similar");
}
// Comparar con procesamiento personalizado
var source1 = new VFPFingerprintSource(@"C:\Videos\video1.mp4")
{
CustomResolution = new Size(640, 480),
StartTime = TimeSpan.FromSeconds(10),
StopTime = TimeSpan.FromMinutes(5)
};
var source2 = new VFPFingerprintSource(@"C:\Videos\video2.mp4")
{
CustomResolution = new Size(640, 480),
StartTime = TimeSpan.FromSeconds(10),
StopTime = TimeSpan.FromMinutes(5)
};
bool match = await VFPAnalyzer.CompareVideoFilesAsync(
source1,
source2,
TimeSpan.FromSeconds(3),
null,
threshold: 50);
Clase VFPFingerPrint¶
Representa una huella digital de video con metadatos y soporte de serialización.
Propiedades¶
public byte[] Data { get; set; }
public TimeSpan Duration { get; set; }
public Guid ID { get; set; }
public string OriginalFilename { get; set; }
public TimeSpan OriginalDuration { get; set; }
public string Tag { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public double FrameRate { get; set; }
public List<Rect> IgnoredAreas { get; set; }
Métodos¶
Load (Estático)¶
Descripción: Carga una huella digital desde archivo o memoria.
Parámetros:
filename(string): Ruta al archivo de huella digitaldata(byte[]): Datos de huella digital en memoria
Devuelve: VFPFingerPrint - Objeto de huella digital cargado
Ejemplo:
// Cargar desde archivo
var fingerprint = VFPFingerPrint.Load(@"C:\Fingerprints\video.vsigx");
Console.WriteLine($"Loaded: {fingerprint.OriginalFilename}");
Console.WriteLine($"Duration: {fingerprint.Duration}");
Console.WriteLine($"ID: {fingerprint.ID}");
// Cargar desde memoria
byte[] fpData = File.ReadAllBytes(@"C:\Fingerprints\video.vsigx");
var fingerprint2 = VFPFingerPrint.Load(fpData);
// Cargar múltiples huellas digitales
var fingerprints = new List<VFPFingerPrint>();
foreach (var file in Directory.GetFiles(@"C:\Fingerprints", "*.vsigx"))
{
try
{
var fp = VFPFingerPrint.Load(file);
fingerprints.Add(fp);
Console.WriteLine($"Loaded: {fp.OriginalFilename} ({fp.Duration})");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to load {file}: {ex.Message}");
}
}
Save¶
Descripción: Guarda la huella digital en archivo o memoria. Extensión predeterminada: .vsigx
Parámetros:
filename(string): Ruta del archivo de salida
Devuelve: byte[] - Datos de huella digital serializados (versión de memoria)
Ejemplo:
// Guardar en archivo
fingerprint.Save(@"C:\Fingerprints\output.vsigx");
// Guardar en memoria
byte[] data = fingerprint.Save();
File.WriteAllBytes(@"C:\Backup\fingerprint.vsigx", data);
// Guardar con metadatos
fingerprint.Tag = "Important scene at 00:42:00";
fingerprint.Save(@"C:\Fingerprints\tagged.vsigx");
// Guardado por lotes con nombres organizados
foreach (var fp in fingerprints)
{
string safeName = Path.GetFileNameWithoutExtension(fp.OriginalFilename)
.Replace(" ", "_")
.Replace(".", "_");
string outputPath = Path.Combine(
@"C:\Fingerprints",
$"{safeName}_{fp.ID}.vsigx");
fp.Save(outputPath);
}
Clase VFPFingerprintSource¶
Configuración para operaciones de huellas digitales de video.
Constructor¶
Descripción: Crea una nueva configuración de fuente.
Parámetros:
filename(string): Ruta al archivo de video
Lanza: FileNotFoundException si el archivo no existe
Propiedades¶
public string Filename { get; }
public TimeSpan StartTime { get; set; }
public TimeSpan StopTime { get; set; }
public Rect CustomCropSize { get; set; }
public Size CustomResolution { get; set; }
public List<Rect> IgnoredAreas { get; }
public TimeSpan OriginalDuration { get; set; }
Filename(string): Ruta al archivo de video fuenteStartTime(TimeSpan): Hora de inicio para la huella digital (predeterminado: 0)StopTime(TimeSpan): Hora de finalización para la huella digital (predeterminado: duración del video)CustomCropSize(Rect): Rectángulo de recorte (distancias Izquierda, Arriba, Derecha, Abajo)CustomResolution(Size): Resolución objetivo (Vacío = sin redimensionar)IgnoredAreas(List<Rect>): Regiones a excluir (por ejemplo, logotipos, marcas de tiempo)OriginalDuration(TimeSpan): Duración total del video (poblado automáticamente)
Ejemplos¶
// Configuración básica
var source = new VFPFingerprintSource(@"C:\Videos\movie.mp4");
// Procesar rango de tiempo específico
var source2 = new VFPFingerprintSource(@"C:\Videos\long_video.mp4")
{
StartTime = TimeSpan.FromMinutes(10),
StopTime = TimeSpan.FromMinutes(20)
};
// Recortar a región de interés
var source3 = new VFPFingerprintSource(@"C:\Videos\video.mp4")
{
CustomCropSize = new Rect(100, 100, 1820, 980) // Eliminar bordes
};
// Redimensionar para procesamiento más rápido
var source4 = new VFPFingerprintSource(@"C:\Videos\4k_video.mp4")
{
CustomResolution = new Size(1280, 720) // Escalar desde 4K
};
// Ignorar superposiciones y logotipos
var source5 = new VFPFingerprintSource(@"C:\Videos\broadcast.mp4");
source5.IgnoredAreas.Add(new Rect(1700, 50, 1870, 150)); // Logotipo del canal
source5.IgnoredAreas.Add(new Rect(50, 50, 250, 100)); // Error de red
source5.IgnoredAreas.Add(new Rect(100, 950, 400, 1000)); // Ticker
// Opciones de procesamiento combinadas
var source6 = new VFPFingerprintSource(@"C:\Videos\tv_show.mp4")
{
StartTime = TimeSpan.FromSeconds(90), // Saltar introducción
StopTime = TimeSpan.FromMinutes(42), // Antes de los créditos
CustomResolution = new Size(640, 480),
CustomCropSize = new Rect(60, 0, 1860, 1080) // Eliminar pillarboxing
};
source6.IgnoredAreas.Add(new Rect(1600, 100, 1800, 200));
Clase VFPCompare¶
Funcionalidad de comparación de huellas digitales de bajo nivel.
Métodos¶
SetLicenseKey¶
Descripción: Establece la clave de licencia del SDK.
Ejemplo:
Process¶
public static int Process(
IntPtr ptr,
int w,
int h,
int s,
TimeSpan dTime,
ref VFPCompareData data)
Descripción: Procesa el cuadro RGB24 para la huella digital de comparación.
Parámetros:
ptr(IntPtr): Puntero a los datos del cuadro RGB24w(int): Ancho del cuadroh(int): Altura del cuadros(int): Stride (bytes por fila)dTime(TimeSpan): Marca de tiempo del cuadrodata(ref VFPCompareData): Estructura de datos de comparación
Devuelve: int - Código de estado (0 = éxito)
Ejemplo:
// Inicializar datos de comparación
var compareData = new VFPCompareData(durationInSeconds: 120);
// Procesar cuadros (generalmente hecho internamente por VFPAnalyzer)
IntPtr frameData = GetRGB24Frame(); // Su fuente de cuadros
int result = VFPCompare.Process(
frameData,
1920, // ancho
1080, // altura
5760, // stride para 1920x3 RGB24
TimeSpan.FromSeconds(1.5),
ref compareData);
if (result == 0)
{
Console.WriteLine("Frame processed successfully");
}
// Construir huella digital después de procesar todos los cuadros
IntPtr fpData = VFPCompare.Build(out long length, ref compareData);
// Limpiar
compareData.Free();
Build¶
Descripción: Construye la huella digital a partir de los cuadros procesados.
Parámetros:
length(out long): Tamaño de los datos de la huella digitalvideo(ref VFPCompareData): Datos de cuadros procesados
Devuelve: IntPtr - Puntero a los datos de la huella digital
Compare¶
Descripción: Compara dos huellas digitales.
Parámetros:
fp1(VFPFingerPrint): Primera huella digitalfp2(VFPFingerPrint): Segunda huella digitalmaxDifference(int): Diferencia máxima permitida
Devuelve: double - Puntuación de similitud (0-100, mayor = más similar)
Ejemplo:
var fp1 = VFPFingerPrint.Load(@"C:\Fingerprints\video1.vsigx");
var fp2 = VFPFingerPrint.Load(@"C:\Fingerprints\video2.vsigx");
double similarity = VFPCompare.Compare(fp1, fp2, maxDifference: 50);
Console.WriteLine($"Similarity: {similarity:F2}%");
if (similarity > 90)
{
Console.WriteLine("Videos are very similar");
}
else if (similarity > 70)
{
Console.WriteLine("Videos have significant similarities");
}
else
{
Console.WriteLine("Videos are different");
}
Clase VFPSearch¶
Funcionalidad de búsqueda de huellas digitales de bajo nivel.
Métodos¶
SetLicenseKey¶
Descripción: Establece la clave de licencia del SDK.
Process¶
Descripción: Procesa el cuadro de video para la huella digital de búsqueda.
Parámetros:
ptr(IntPtr): Puntero de datos del cuadro RGB24w(int): Ancho del cuadroh(int): Altura del cuadros(int): StridedTime(TimeSpan): Marca de tiempo del cuadrodata(ref VFPSearchData): Estructura de datos de búsqueda
Devuelve: int - Código de estado
Build¶
Descripción: Construye la huella digital de búsqueda.
Parámetros:
length(out long): Tamaño de datos de la huella digitaldata(ref VFPSearchData): Cuadros procesados
Devuelve: IntPtr - Puntero de datos de la huella digital
Search¶
public static int Search(
VFPFingerPrint fp1,
int startPos1,
VFPFingerPrint fp2,
int startPos2,
out int difference,
int maxDifference)
Descripción: Busca fragmento en video.
Parámetros:
fp1(VFPFingerPrint): Huella digital del fragmentostartPos1(int): Posición de inicio en el fragmento (segundos)fp2(VFPFingerPrint): Huella digital del video principalstartPos2(int): Posición de inicio de búsqueda (segundos)difference(out int): Puntuación de diferencia de coincidenciamaxDifference(int): Diferencia máxima permitida
Devuelve: int - Posición donde se encontró (segundos) o Int32.MaxValue si no se encontró
Ejemplo:
// Buscar fragmento
var fragmentFp = VFPFingerPrint.Load(@"C:\Fingerprints\fragment.vsigx");
var videoFp = VFPFingerPrint.Load(@"C:\Fingerprints\full_video.vsigx");
int position = VFPSearch.Search(
fragmentFp,
startPos1: 0,
videoFp,
startPos2: 0,
out int matchDifference,
maxDifference: 20);
if (position != Int32.MaxValue)
{
Console.WriteLine($"Fragment found at {position} seconds");
Console.WriteLine($"Match quality: {matchDifference}");
}
else
{
Console.WriteLine("Fragment not found");
}
// Buscar desde una posición específica
int nextPosition = VFPSearch.Search(
fragmentFp,
0,
videoFp,
position + 30, // Saltar más allá de la primera coincidencia
out matchDifference,
maxDifference: 20);
Clase VFPFingerPrintDB¶
Base de datos para gestionar colecciones de huellas digitales.
Propiedades¶
Métodos¶
Save¶
Descripción: Guarda la base de datos en un archivo.
Ejemplo:
var db = new VFPFingerPrintDB();
// Agregar huellas digitales
foreach (var videoFile in Directory.GetFiles(@"C:\Videos", "*.mp4"))
{
var source = new VFPFingerprintSource(videoFile);
var fp = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
if (fp != null)
{
db.Items.Add(fp);
}
}
// Guardar base de datos
db.Save(@"C:\Database\fingerprints.db");
Console.WriteLine($"Saved {db.Items.Count} fingerprints to database");
Load (Estático)¶
Descripción: Carga la base de datos desde un archivo.
Ejemplo:
// Cargar base de datos existente
var db = VFPFingerPrintDB.Load(@"C:\Database\fingerprints.db");
Console.WriteLine($"Loaded {db.Items.Count} fingerprints");
// Consultar base de datos
var recentVideos = db.Items
.Where(fp => fp.OriginalDuration > TimeSpan.FromMinutes(30))
.OrderBy(fp => fp.OriginalFilename)
.ToList();
foreach (var fp in recentVideos)
{
Console.WriteLine($"{fp.OriginalFilename}: {fp.Duration}");
}
ContainsFile¶
Descripción: Comprueba si la base de datos contiene una huella digital para la fuente.
Ejemplo:
var source = new VFPFingerprintSource(@"C:\Videos\new_video.mp4");
if (!db.ContainsFile(source))
{
// Generar y agregar nueva huella digital
var fp = await VFPAnalyzer.GetComparingFingerprintForVideoFileAsync(source);
db.Items.Add(fp);
db.Save(@"C:\Database\fingerprints.db");
}
else
{
Console.WriteLine("Fingerprint already exists in database");
}
GetFingerprint¶
Descripción: Recupera la huella digital que coincide con la fuente.
Ejemplo:
var source = new VFPFingerprintSource(@"C:\Videos\video.mp4");
var fp = db.GetFingerprint(source);
if (fp != null)
{
Console.WriteLine($"Found fingerprint: {fp.ID}");
Console.WriteLine($"Duration: {fp.Duration}");
Console.WriteLine($"Tag: {fp.Tag}");
}
Clase VFPFingerprintFromFrames¶
Crea huellas digitales a partir de cuadros de imagen individuales. Disponible en todas las plataformas.
Constructor¶
Descripción: Inicializa el constructor de huellas digitales basado en cuadros.
Parámetros:
frameRate(double): Tasa de cuadros de videowidth(int): Ancho del cuadroheight(int): Altura del cuadrototalDuration(TimeSpan): Duración total del video
Métodos¶
Push¶
public void Push(byte[] rgb24frame) // All platforms
public void Push(Bitmap frame) // Windows only
public void Push(SKBitmap frame) // All platforms (new)
public void Push(IntPtr rgb24frame, int rgb24frameSize) // All platforms
Descripción: Agrega cuadros al proceso de generación de huellas digitales. Los cuadros deben coincidir con las dimensiones configuradas.
- byte[]: Datos de cuadro RGB24 sin procesar (multiplataforma)
- Bitmap: System.Drawing.Bitmap (solo Windows)
- SKBitmap: Mapa de bits SkiaSharp para soporte multiplataforma
- IntPtr: Puntero a datos de cuadro RGB24 (multiplataforma)
Ejemplo:
// Crear constructor
var builder = new VFPFingerprintFromFrames(
frameRate: 30.0,
width: 1920,
height: 1080,
totalDuration: TimeSpan.FromMinutes(5));
// Multiplataforma: Agregar cuadros como matrices de bytes
foreach (var frameData in videoStream.GetFrames())
{
builder.Push(frameData); // byte[] RGB24
}
// Multiplataforma: Agregar mapas de bits SkiaSharp
using (var skBitmap = SKBitmap.Decode(imageData))
{
builder.Push(skBitmap);
}
// Solo Windows: Agregar cuadros System.Drawing.Bitmap
#if NET_WINDOWS
for (int i = 0; i < frameCount; i++)
{
Bitmap frame = GetFrameAsBitmap(i);
builder.Push(frame);
}
#endif
// Multiplataforma: Agregar cuadros vía IntPtr
unsafe
{
fixed (byte* ptr = frameData)
{
builder.Push(new IntPtr(ptr), frameData.Length);
}
}
// Construir huella digital final
var fingerprint = builder.Build();
fingerprint.OriginalFilename = "stream_capture.mp4";
fingerprint.Save(@"C:\Fingerprints\stream.vsigx");
Build¶
Descripción: Genera huella digital a partir de cuadros procesados.
Devuelve: VFPFingerPrint - Huella digital generada
Tipos de Soporte¶
VFPCompareData¶
public struct VFPCompareData
{
public IntPtr Data { get; set; }
public VFPCompareData(int duration)
public void Free()
}
Descripción: Gestiona datos de comparación nativos.
Ejemplo:
// Crear y usar datos de comparación
var data = new VFPCompareData(durationInSeconds: 60);
try
{
// Process frames...
// Build fingerprint...
}
finally
{
data.Free(); // Siempre liberar memoria nativa
}
VFPSearchData¶
public class VFPSearchData : IDisposable
{
public IntPtr Data { get; set; }
public VFPSearchData(TimeSpan duration)
public void Free()
public void Dispose()
}
Descripción: Gestiona datos de búsqueda nativos con eliminación automática.
Ejemplo:
// La declaración using asegura una limpieza adecuada
using (var searchData = new VFPSearchData(TimeSpan.FromMinutes(2)))
{
// Process frames for search fingerprint
// Build fingerprint
} // Automatically disposed
Delegados¶
VFPProgressCallback¶
Descripción: Informa el progreso durante las operaciones de huellas digitales (0-100).
Ejemplo:
// Visualización de progreso simple
VFPProgressCallback progressCallback = (percent) =>
{
Console.Write($"\rProgress: {percent}%");
if (percent == 100) Console.WriteLine();
};
// Progreso con actualización de UI
VFPProgressCallback uiProgress = (percent) =>
{
progressBar.Value = percent;
labelStatus.Text = $"Processing: {percent}%";
Application.DoEvents();
};
// Progreso con verificación de cancelación
CancellationToken token = GetCancellationToken();
VFPProgressCallback cancellableProgress = (percent) =>
{
if (token.IsCancellationRequested)
throw new OperationCanceledException();
UpdateProgress(percent);
};
VFPErrorCallback¶
Descripción: Informa errores durante las operaciones de huellas digitales.
Ejemplo:
// Registrar errores
VFPErrorCallback errorCallback = (error) =>
{
logger.Error($"VFP Error: {error}");
File.AppendAllText(@"C:\Logs\vfp_errors.log",
$"{DateTime.Now}: {error}{Environment.NewLine}");
};
// Mostrar errores al usuario
VFPErrorCallback userErrorCallback = (error) =>
{
MessageBox.Show($"Error processing video: {error}",
"Fingerprinting Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
};
// Recopilar errores para procesamiento por lotes
var errors = new List<string>();
VFPErrorCallback collectErrors = (error) => errors.Add(error);