繁体   English   中英

如何在 EMGUCV 中使用 Facemarker?

[英]How to use Facemarker in EMGUCV?

我正在尝试遵循此 OpenCV 教程,但我还没有设法创建 FaceInvoke.FaceDetectNative 函数,我尝试使用此函数但应用程序停止工作。

static bool MyDetector(IntPtr input, IntPtr output)
    {
        CascadeClassifier faceDetector = new CascadeClassifier(@"..\..\Resource\EMGUCV\haarcascade_frontalface_default.xml");
        Image<Gray, byte> grayImage = (new Image<Bgr, byte>(CvInvoke.cvGetSize(input))).Convert<Gray, byte>();
        grayImage._EqualizeHist();
        Rectangle[] faces = faceDetector.DetectMultiScale(grayImage, 1.1, 10, Size.Empty);
        VectorOfRect rects = new VectorOfRect(faces);
        CvInvoke.cvCopy(rects.Ptr, output, IntPtr.Zero);
        return true;
    }

另一方面,我尝试通过传递 Mat object = new Mat (); 来调用 GetFaces 方法。 作为 IOutputArray 也没有工作(崩溃错误)。

FacemarkLBFParams fParams = new FacemarkLBFParams();
        fParams.ModelFile = @"..\..\Resource\EMGUCV\facemarkmodel.yaml";
        FacemarkLBF facemark = new FacemarkLBF(fParams);
        facemark.SetFaceDetector(MyDetector);

        VectorOfRect result = new VectorOfRect();
        Image<Bgr, Byte> image = new Image<Bgr, byte>(@"C:\Users\matias\Documents\Proyectos\100-20.bmp");
        bool success = facemark.GetFaces(image, result);

        Rectangle[] faces = result.ToArray();

谢谢

几个小时后,我设法检测到人脸的点,为此使用 Fit 方法,该方法接收图像、人脸(例如 VectorOfRect)和用于输出的 VectorOfVectorOfPointF

public Image<Bgr, Byte> GetFacePoints()
    {
        CascadeClassifier faceDetector = new CascadeClassifier(@"..\..\Resource\EMGUCV\haarcascade_frontalface_default.xml");
        FacemarkLBFParams fParams = new FacemarkLBFParams();
        fParams.ModelFile = @"..\..\Resource\EMGUCV\lbfmodel.yaml";
        fParams.NLandmarks = 68; // number of landmark points
        fParams.InitShapeN = 10; // number of multiplier for make data augmentation
        fParams.StagesN = 5; // amount of refinement stages
        fParams.TreeN = 6; // number of tree in the model for each landmark point
        fParams.TreeDepth = 5; //he depth of decision tree
        FacemarkLBF facemark = new FacemarkLBF(fParams);
        //facemark.SetFaceDetector(MyDetector);

        Image<Bgr, Byte> image = new Image<Bgr, byte>(@"C:\Users\matias\Downloads\personas-buena-vibra-caracteristicas-1200x600.jpg");
        Image<Gray, byte> grayImage = image.Convert<Gray, byte>();
        grayImage._EqualizeHist();

        VectorOfRect faces = new VectorOfRect(faceDetector.DetectMultiScale(grayImage));
        VectorOfVectorOfPointF landmarks = new VectorOfVectorOfPointF();
        facemark.LoadModel(fParams.ModelFile);

        bool success = facemark.Fit(grayImage, faces, landmarks);
        if (success)
        {
            Rectangle[] facesRect = faces.ToArray();
            for (int i = 0; i < facesRect.Length; i++)
            {
                image.Draw(facesRect[i], new Bgr(Color.Blue), 2);
                FaceInvoke.DrawFacemarks(image, landmarks[i], new Bgr(Color.Blue).MCvScalar);
            }
            return image;
        }
        return null;
    }

现在剩下的就是优化代码并继续我的项目

非常感谢Matias。 它是完美的。 您只使用过emgu文档吗? 因为它似乎没有真正解释中...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM