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); } } }