在DlibDotNet中提取检测到的面部

时间:2019-12-23 18:57:45

标签: c# .net-core face-detection dlib

我正在使用DlibDotNet,并且是其中的新手。我有来自Detect Faces With C# And Dlib In Only 40 Lines Of Code的以下代码:

        static void Main(string[] args)
        {
            // set up Dlib facedetector
            using (var fd = Dlib.GetFrontalFaceDetector())
            {
                var img = Dlib.LoadImage<RgbPixel>(inputFilePath);

                // find all faces in the image
                var faces = fd.Operator(img);
                foreach (var face in faces)
                {
                    // draw a rectangle for each face
                    Dlib.DrawRectangle(img, face, color: new RgbPixel(0, 255, 255), thickness: 4);
                }
                Dlib.SaveJpeg(img, "output.jpg");
            }
        }

问题是如何提取图像中检测到的所有面部? 我已经测试过Dlib.ExtractImageChips()方法,但是我不知道如何正确使用它。

谢谢。

2 个答案:

答案 0 :(得分:1)

使用Dlib.GetFaceChipDetails()和Dlib.ExtractImageChips()之后,您应该从给定图像中获取人脸图像,只需将其转换为Bitmap。转换
Array2D到Bitmap,您应该在项目中添加DlibDotNet.Extensions DLL最新版本。代码看起来像

List<Image> images = new List<Image>();

using (var faceChips = Dlib.ExtractImageChips<RgbPixel>(img, chipLocations))
{
    Image image = null;
    //Iterate face chips and add image one by one if multiple images existed
    foreach (var face in faceChips)
    {
        image = face.ToBitmap();
        images.Add(image);
    }
}

Here is a sample application展示了如何从图像文件中提取面部图像。

答案 1 :(得分:0)

我在进入库后找到了方法。这是实现:

DPoint[] dPoint = new DPoint[] {
                    new DPoint(face.TopLeft.X, face.TopLeft.Y),
                    new DPoint(face.TopRight.X, face.TopRight.Y),
                    new DPoint(face.BottomLeft.X, face.BottomLeft.Y),
                    new DPoint(face.BottomRight.X, face.BottomRight.Y),
                };
                    int width = (int)dRectangle.Width;
                    int height = (int)dRectangle.Height;

                    img = Dlib.ExtractImage4Points(img, dPoint, width, height);

其中img是源图像,dPoint是由四个点组成的数组,这些点代表提取图像的四个角,宽度和高度是提取图像的像素大小。