/// <summary> /// Initializes a new instance of SerializableFace object /// </summary> /// <param name="face">Base face</param> public SerializableFace(Face face) { this.compressedFeatures = face.CompressedFeatures; this.features = face.Features; this.id = face.Id; this.name = face.Name; this.originalBitmap = face.OriginalBitmap; this.vlFace = face.VlFace; }
/// <summary> /// Recognizes multiple faces from a single image frame /// </summary> /// <param name="image">Neurotec Image in which is based the face recognition</param> /// <param name="vlFaces">Array of faces detected</param> /// <param name="recognizedFaces">Array of Face objects used to realize each recognition</param> /// <param name="MultipleRecognitionResults">An array containing all recognition results for each recognized face</param> /// <returns>An array containing best match in all known faces.</returns> private RecognitionResult[] RecognizeMultipleFaces(NImage image, VleFace[] vlFaces, out FaceCollection detectedFaces, out RecognitionResult[][] MultipleRecognitionResults) { #region Variables // Stores the original image as bitmap Bitmap bmp; // Bitmap to draw in the detected face region Bitmap croppedBitmap; // Graphics used to copy the face detected region Graphics g; // Rectangle used to copy the scaled region of face detected Rectangle rect; // Nurotec Image required in the process of recognize the face detected region NGrayscaleImage gray; // Verilook Detetion Details as result of face recognition VleDetectionDetails detectionDetails; // The face template result of a face recognition byte[][] templates = new byte[vlFaces.Length][]; // The face features result of a face recognition byte[] features; // Stores the current recognition face Face currentFace; // Stores the recognized faces //FaceCollection recognizedFaces = new FaceCollection(vlFaces.Length); detectedFaces = new FaceCollection(vlFaces.Length); // Stores the best recognition result for current face RecognitionResult currentResult; // Stores the recognition results for current face RecognitionResult[] currentRecognitionResults; // Stores all Recognition results List<RecognitionResult[]> recognitionResults = new List<RecognitionResult[]>(); // Stores the best recognition result matches List<RecognitionResult> selectedResults = new List<RecognitionResult>(); #endregion // Get the original image as bitmap bmp = new Bitmap(image.ToBitmap()); // Extract each face, and get its template foreach (VleFace vlFace in vlFaces) { // Get a rectangle a bit larger than the one the face has been recognized. // Its because some times in the exact area of the face the face cannot be recognized again //rect = new Rectangle(vlFace.Rectangle.X - 50, vlFace.Rectangle.Y - 50, vlFace.Rectangle.Width + 100, vlFace.Rectangle.Height + 100); rect = new Rectangle(vlFace.Rectangle.X - vlFace.Rectangle.Width / 2, vlFace.Rectangle.Y - vlFace.Rectangle.Height / 2, vlFace.Rectangle.Width * 2, vlFace.Rectangle.Height * 2); // Get the face bitmap croppedBitmap = new Bitmap(rect.Width, rect.Height); g = Graphics.FromImage(croppedBitmap); g.DrawImage(bmp, 0, 0, rect, GraphicsUnit.Pixel); // Get gray image for face detection gray = (NGrayscaleImage)NImage.FromImage(NPixelFormat.Grayscale, 0, NImage.FromBitmap(croppedBitmap)); // Extract the face and extract its template currentFace = new Face(vlFace); features = vlExtractor.Extract(gray, out detectionDetails); if (!detectionDetails.FaceAvailable) continue; UseResources(); currentFace.SetRecognitionData(features, detectionDetails, croppedBitmap); ReleaseResources(); currentFace.CalculateFovAndCoords((int)image.Width, (int)image.Height); detectedFaces.Add(currentFace); Console("Found face: location = (" + detectionDetails.Face.Rectangle.X + ", " + detectionDetails.Face.Rectangle.Y + "), width = " + detectionDetails.Face.Rectangle.Width + ", height = " + detectionDetails.Face.Rectangle.Height + ", confidence = " + detectionDetails.Face.Confidence); try { croppedBitmap.Dispose(); g.Dispose(); gray.Dispose(); } catch { } } if (detectedFaces.Count > 0) Console(detectedFaces.Count.ToString() + " faces found."); if (knownFaces.Count > 0) { Console("Initializing recognition"); // Recognize each detected face for (int i = 0; i < detectedFaces.Count; ++i) { if (detectedFaces[i].Features == null) continue; currentFace = detectedFaces[i]; // Start recognition currentResult = Recognize(currentFace, out currentRecognitionResults); if (currentResult == null) continue; selectedResults.Add(currentResult); recognitionResults.Add(currentRecognitionResults); } } MultipleRecognitionResults = recognitionResults.ToArray(); return selectedResults.ToArray(); }
/// <summary> /// Recognizes multiple faces from a single image frame /// </summary> /// <param name="image">Neurotec Image in which is based the face recognition</param> /// <param name="vlFaces">Array of faces detected</param> /// <returns>An array containing best match in all known faces.</returns> private RecognitionResult[] RecognizeMultipleFaces(NImage image, VleFace[] vlFaces) { RecognitionResult[][] MultipleRecognitionResults; FaceCollection recognizedFaces; return RecognizeMultipleFaces(image, vlFaces, out recognizedFaces, out MultipleRecognitionResults); }
/// <summary> /// Recognizes a single face from a single image frame /// </summary> /// <param name="image">Neurotec Image in which is based the face recognition</param> /// <param name="vlFace">Face detected in which region is the face to recognize</param> /// <param name="face">Face object used to realize a recognition</param> /// <param name="recognitionResults">An array containing all recognition results for the recognized face</param> /// <returns>The best match in all known faces. Null if not found</returns> private RecognitionResult RecognizeFace(NImage image, VleFace vlFace, out Face face, out RecognitionResult[] recognitionResults) { // Bitmap to draw in the detected face region Bitmap croppedBitmap; // Graphics used to copy the face detected region Graphics g; // Rectangle used to copy the scaled region of face detected Rectangle rect; // The recognition result obtained RecognitionResult result; // Get a rectangle a bit larger than the one the face has been recognized. // Its because some times in the exact area of the face the face cannot be recognized again //rect = new Rectangle(vlFace.Rectangle.X - 50, vlFace.Rectangle.Y - 50, vlFace.Rectangle.Width + 100, vlFace.Rectangle.Height + 100); rect = new Rectangle(vlFace.Rectangle.X - vlFace.Rectangle.Width / 2, vlFace.Rectangle.Y - vlFace.Rectangle.Height / 2, vlFace.Rectangle.Width * 2, vlFace.Rectangle.Height * 2); croppedBitmap = new Bitmap(rect.Width, rect.Height); g = Graphics.FromImage(croppedBitmap); g.DrawImage(image.ToBitmap(), 0, 0, rect, GraphicsUnit.Pixel); face = new Face(vlFace); result = RecognizeFace(NImage.FromBitmap(croppedBitmap), ref face, out recognitionResults); return result; }
/// <summary> /// Recognizes a single face from a single image frame /// </summary> /// <param name="image">Neurotec Image in which is based the face recognition</param> /// <param name="vlFace">Face detected in which region is the face to recognize</param> /// <returns>The best match in all known faces. Null if not found</returns> private RecognitionResult RecognizeFace(NImage image, VleFace vlFace) { RecognitionResult[] recognitionResults; Face face; return RecognizeFace(image, vlFace, out face, out recognitionResults); }
/// <summary> /// Updates the output video control /// </summary> /// <param name="image">Base Image</param> /// <param name="faces">List of faces detected</param> private void RecognitionResultUpdate(Bitmap image, VleFace[] faces) { /* if (this.InvokeRequired) { if (!this.IsHandleCreated || this.Disposing || this.IsDisposed) return; this.BeginInvoke(dlgRecognitionResultUpdate, image, faces); return; } vcRecognitionResult.Image = image; vcRecognitionResult.Faces = faces; //vcRecognitionResult.DetectionDetails = details; */ }
/// <summary> /// Updates the output video control /// </summary> /// <param name="image">Base Image</param> /// <param name="faces">List of faces detected</param> private void RecognitionResultUpdate(Bitmap image, Face[] faces) { if (this.InvokeRequired) { if (!this.IsHandleCreated || this.Disposing || this.IsDisposed) return; this.BeginInvoke(dlgRecognitionResultUpdate4, image, faces); return; } VleFace[] vlFaces; VleDetectionDetails[] vlDetails; vlFaces = new VleFace[faces.Length]; vlDetails = new VleDetectionDetails[faces.Length]; for (int i = 0; i < faces.Length; ++i) { if (faces[i] != null) { vlFaces[i] = faces[i].VlFace; vlDetails[i] = faces[i].DetectionDetails; } } vcRecognitionResult.Image = image; vcRecognitionResult.Faces = vlFaces; vcRecognitionResult.DetectionDetails = vlDetails; if (faces[0].HasFOV) { vcRecognitionResult.String = "(" + faces[0].HFoV.ToString("0.00") + "," + faces[0].VFoV.ToString("0.00") + ")"; } }
/// <summary> /// Updates the output video control /// </summary> /// <param name="image">Base Image</param> /// <param name="faces">List of faces detected</param> private void RecognitionResultUpdate(Bitmap image, Face face) { if (face == null) return; if (this.InvokeRequired) { if (!this.IsHandleCreated || this.Disposing || this.IsDisposed) return; this.BeginInvoke(dlgRecognitionResultUpdate3, image, face); return; } VleFace[] vlFaces; VleDetectionDetails[] vlDetails; vlFaces = new VleFace[] { face.VlFace }; vlDetails = new VleDetectionDetails[] { face.DetectionDetails }; vcRecognitionResult.Image = image; vcRecognitionResult.Faces = vlFaces; vcRecognitionResult.DetectionDetails = vlDetails; if (face.HasFOV) { vcRecognitionResult.String = "FOV: (" + face.HFoV.ToString("0.00") + "," + face.VFoV.ToString("0.00") + ")"; } }