From a838fffc28b510ba88bdee16d409d9a530062a70 Mon Sep 17 00:00:00 2001 From: Canming Huang Date: Tue, 16 Jan 2018 19:29:42 -0500 Subject: [PATCH] More functions added to facemask. --- Emgu.CV.Contrib/Face/IFacemark.cs | 50 +++++++++++++++++++++++++++++-- Emgu.CV.Extern/face/face_c.cpp | 17 +++++++++++ Emgu.CV.Extern/face/face_c.h | 5 ++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/Emgu.CV.Contrib/Face/IFacemark.cs b/Emgu.CV.Contrib/Face/IFacemark.cs index 120ca4c9f..862462d08 100644 --- a/Emgu.CV.Contrib/Face/IFacemark.cs +++ b/Emgu.CV.Contrib/Face/IFacemark.cs @@ -13,7 +13,7 @@ using Emgu.Util; namespace Emgu.CV.Face { - public interface IFacemark + public interface IFacemark { /// @@ -29,7 +29,7 @@ namespace Emgu.CV public static partial class ContribInvoke { - public static bool SetFaceDetector(Emgu.CV.Face.IFacemark facemark, FaceDetectNative faceDetect) + public static bool SetFaceDetector(this Emgu.CV.Face.IFacemark facemark, FaceDetectNative faceDetect) { return cveFacemarkSetFaceDetector(facemark.FacemarkPtr, faceDetect); } @@ -40,5 +40,51 @@ namespace Emgu.CV [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] [return: MarshalAs(CvInvoke.BoolMarshalType)] internal extern static bool cveFacemarkSetFaceDetector(IntPtr facemark, FaceDetectNative detector); + + public static void LoadModel(this Emgu.CV.Face.IFacemark facemark, String model) + { + using (CvString cs = new CvString(model)) + { + cveFacemarkLoadModel(facemark.FacemarkPtr, cs); + } + } + [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] + internal extern static void cveFacemarkLoadModel(IntPtr facemark, IntPtr model); + + public static bool GetFaces(this Emgu.CV.Face.IFacemark facemark, IInputArray image, IOutputArray faces) + { + using (InputArray iaImage = image.GetInputArray()) + using (OutputArray oaFaces = faces.GetOutputArray()) + { + return cveFacemarkGetFaces(facemark.FacemarkPtr, iaImage, oaFaces); + } + } + [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] + [return: MarshalAs(CvInvoke.BoolMarshalType)] + internal extern static bool cveFacemarkGetFaces(IntPtr facemark, IntPtr image, IntPtr faces); + + public static bool Fit(this Emgu.CV.Face.IFacemark facemark, IInputArray image, IInputArray faces, IInputOutputArray landmarks) + { + using (InputArray iaImage = image.GetInputArray()) + using (InputArray iaFaces = faces.GetInputArray()) + using (InputOutputArray ioaLandmarks = landmarks.GetInputOutputArray()) + { + return cveFacemarkFit(facemark.FacemarkPtr, iaImage, iaFaces, ioaLandmarks); + } + } + [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] + [return: MarshalAs(CvInvoke.BoolMarshalType)] + internal extern static bool cveFacemarkFit(IntPtr facemark, IntPtr image, IntPtr faces, IntPtr landmarks); + + public static void DrawFacemarks(IInputOutputArray image, IInputArray points, MCvScalar color) + { + using (InputOutputArray ioaImage = image.GetInputOutputArray()) + using (InputArray iaPoints = points.GetInputArray()) + { + cveDrawFacemarks(ioaImage, iaPoints, ref color); + } + } + [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] + internal extern static void cveDrawFacemarks(IntPtr image, IntPtr points, ref MCvScalar color); } } \ No newline at end of file diff --git a/Emgu.CV.Extern/face/face_c.cpp b/Emgu.CV.Extern/face/face_c.cpp index aa15d89fa..f155eb0a8 100644 --- a/Emgu.CV.Extern/face/face_c.cpp +++ b/Emgu.CV.Extern/face/face_c.cpp @@ -109,4 +109,21 @@ bool myDetector(cv::InputArray image, cv::OutputArray faces, CSharp_FaceDetector bool cveFacemarkSetFaceDetector(cv::face::Facemark* facemark, CSharp_FaceDetector detector) { return facemark->setFaceDetector((cv::face::FN_FaceDetector) myDetector, detector); +} + +void cveFacemarkLoadModel(cv::face::Facemark* facemark, cv::String* model) +{ + facemark->loadModel(*model); +} +bool cveFacemarkGetFaces(cv::face::Facemark* facemark, cv::_InputArray* image, cv::_OutputArray* faces) +{ + facemark->getFaces(*image, *faces); +} +bool cveFacemarkFit(cv::face::Facemark* facemark, cv::_InputArray* image, cv::_InputArray* faces, cv::_InputOutputArray* landmarks) +{ + facemark->fit(*image, *faces, *landmarks); +} +void cveDrawFacemarks(cv::_InputOutputArray* image, cv::_InputArray* points, CvScalar* color) +{ + cv::face::drawFacemarks(*image, *points, *color); } \ No newline at end of file diff --git a/Emgu.CV.Extern/face/face_c.h b/Emgu.CV.Extern/face/face_c.h index 5fbddce8a..fcb6dda33 100644 --- a/Emgu.CV.Extern/face/face_c.h +++ b/Emgu.CV.Extern/face/face_c.h @@ -36,4 +36,9 @@ CVAPI(void) cveFacemarkLBFRelease(cv::face::FacemarkLBF** facemark); typedef bool(*CSharp_FaceDetector)(const cv::_InputArray*, const cv::_OutputArray*); CVAPI(bool) cveFacemarkSetFaceDetector(cv::face::Facemark* facemark, CSharp_FaceDetector detector); + +CVAPI(void) cveFacemarkLoadModel(cv::face::Facemark* facemark, cv::String* model); +CVAPI(bool) cveFacemarkGetFaces(cv::face::Facemark* facemark, cv::_InputArray* image, cv::_OutputArray* faces); +CVAPI(bool) cveFacemarkFit(cv::face::Facemark* facemark, cv::_InputArray* image, cv::_InputArray* faces, cv::_InputOutputArray* landmarks); +CVAPI(void) cveDrawFacemarks(cv::_InputOutputArray* image, cv::_InputArray* points, CvScalar* color); #endif \ No newline at end of file