Example #1
0
        public FaceLandmark[] DetectFaceLandmarks(Array2dRgbPixel array2dRgbPixel, double faceDetectionThreshold)
        {
            var ret = new FaceLandmark[0];

            try
            {
                dets = NativeMethods.vector_FaceLandmarkInternal_new1();
                NativeMethods.dlib_face_landmark_detection_operator(detector, array2dRgbPixel.DlibArray2dRgbPixel, faceDetectionThreshold, dets);
                Trace.Assert(dets != null && dets != IntPtr.Zero);
                long count = NativeMethods.vector_FaceLandmarkInternal_getSize(dets).ToInt64();
                // If it does not return ret here, exception occurs.
                if (count == 0)
                {
                    return(ret);
                }
                unsafe
                {
                    FaceLandmarkInternal *faceLandmarkInternals = (FaceLandmarkInternal *)NativeMethods.vector_FaceLandmarkInternal_getPointer(dets).ToPointer();
                    ret = new FaceLandmark[count];
                    for (int i = 0; i < count; i++)
                    {
                        ret[i] = new FaceLandmark(faceLandmarkInternals[i]);
                    }
                }
            }
            catch (Exception ex)
            {
#if DEBUG
                Debugger.Break();
#endif
                Console.WriteLine(ex.Message);
            }
            finally
            {
                ReleaseDets();
            }
            return(ret);
        }
        public void RawApiFaceLandmarkDetectionUsingMemoryInput()
        {
            const string imagePath  = "images\\lenna.bmp";
            var          imageBytes = File.ReadAllBytes(imagePath);

            IntPtr detector = IntPtr.Zero;
            IntPtr dets     = IntPtr.Zero;

            try
            {
                using (var window = new ImageWindow())
                    using (var image = new Array2dRgbPixel())
                    {
                        Console.WriteLine($"Size: ({image.Width},{image.Height})");
                        Trace.Assert(image.Width == 0 && image.Height == 0);
                        window.SetImage(image);
                        OpenCvSharp.Cv2.WaitKey(Cv2WaitKeyDelay);

                        NativeMethods.dlib_load_bmp_array2d_rgbpixel(image.DlibArray2dRgbPixel, imageBytes, new IntPtr(imageBytes.Length));
                        Console.WriteLine($"Size: ({image.Width},{image.Height})");
                        Trace.Assert(image.Width == 512 && image.Height == 480);
                        window.SetImage(image);
                        OpenCvSharp.Cv2.WaitKey(Cv2WaitKeyDelay);

                        image.SetBitmap(new System.Drawing.Bitmap(imagePath));
                        Console.WriteLine($"Size: ({image.Width},{image.Height})");
                        Trace.Assert(image.Width == 512 && image.Height == 480);
                        window.SetImage(image);
                        OpenCvSharp.Cv2.WaitKey(Cv2WaitKeyDelay);

                        image.PyramidUp();
                        Console.WriteLine($"Size: ({image.Width},{image.Height})");
                        window.SetImage(image);
                        OpenCvSharp.Cv2.WaitKey(Cv2WaitKeyDelay);

                        detector = NativeMethods.dlib_get_face_landmark_detection("D:/Data/Dlib/shape_predictor_68_face_landmarks.dat");
                        dets     = NativeMethods.vector_FaceLandmarkInternal_new1();
                        NativeMethods.dlib_face_landmark_detection_operator(detector, image.DlibArray2dRgbPixel, -0.5, dets);
                        Trace.Assert(dets != null && dets != IntPtr.Zero);
                        long count = NativeMethods.vector_FaceLandmarkInternal_getSize(dets).ToInt64();
                        // If it does not return ret here, exception occurs.
                        if (count > 0)
                        {
                            unsafe
                            {
                                FaceLandmarkInternal *faceLandmarkInternals = (FaceLandmarkInternal *)NativeMethods.vector_FaceLandmarkInternal_getPointer(dets).ToPointer();
                                for (int i = 0; i < count; i++)
                                {
                                    Console.WriteLine(new FaceLandmark(faceLandmarkInternals[i]));
                                }
                            }
                        }
                    }
            }
            finally
            {
                if (detector != IntPtr.Zero)
                {
                    NativeMethods.dlib_face_landmark_detection_delete(detector);
                }
                if (dets != IntPtr.Zero)
                {
                    NativeMethods.vector_FaceLandmarkInternal_delete(dets);
                }
            }
        }