Esempio n. 1
0
 /// <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;
 }
Esempio n. 2
0
        /// <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();
        }
Esempio n. 3
0
 /// <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);
 }
Esempio n. 4
0
        /// <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;
        }
Esempio n. 5
0
 /// <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);
 }
Esempio n. 6
0
 /// <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;
     */
 }
Esempio n. 7
0
		/// <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") + ")";
			}
		}
Esempio n. 8
0
		/// <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") + ")";
			}
		}