我正在用HttpHandler
C# 编写一个提供调整大小的图像和等等等等……没有麻烦,我们有数百万个处理程序可用作参考。
问题是我的用户照片是用“传统”尺寸拍摄的,如 4:3 和 16:9。但是这个处理程序需要以照片 ID 大小(4cm x 3cm)提供图片,并且显然需要在用户面部周围进行裁剪。面部位置变化很大(并不总是在图片中心)。
那么,我可以使用哪种算法来检测人脸中心,然后围绕该点裁剪图像?
我正在用HttpHandler
C# 编写一个提供调整大小的图像和等等等等……没有麻烦,我们有数百万个处理程序可用作参考。
问题是我的用户照片是用“传统”尺寸拍摄的,如 4:3 和 16:9。但是这个处理程序需要以照片 ID 大小(4cm x 3cm)提供图片,并且显然需要在用户面部周围进行裁剪。面部位置变化很大(并不总是在图片中心)。
那么,我可以使用哪种算法来检测人脸中心,然后围绕该点裁剪图像?
您可以在 EmguCV(OpenCV 的 DotNet 端口)http://www.emgu.com/wiki/index.php/Face_detection中使用 HaarCascade 类
运行此示例的注意事项:
- 创建 Windows 窗体应用程序
- 添加一个 PictureBox 和一个计时器(并启用它) - 在 x86 系统上运行它
- 确保在执行代码的文件夹中有 OpenCV 相关的 dll(Emgu CV 下载中包含)。
- 调整路径找到Haarcascade xml(代码最后一行)
using System;
using System.Windows.Forms;
using System.Drawing;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
namespace opencvtut
{
public partial class Form1 : Form
{
private Capture cap;
private HaarCascade haar;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
using (Image<Bgr, byte> nextFrame = cap.QueryFrame())
{
if (nextFrame != null)
{
// there's only one channel (greyscale), hence the zero index
//var faces = nextFrame.DetectHaarCascade(haar)[0];
Image<Gray, byte> grayframe = nextFrame.Convert<Gray, byte>();
var faces =
grayframe.DetectHaarCascade(
haar, 1.4, 4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(nextFrame.Width/8, nextFrame.Height/8)
)[0];
foreach (var face in faces)
{
nextFrame.Draw(face.rect, new Bgr(0,double.MaxValue,0), 3);
}
pictureBox1.Image = nextFrame.ToBitmap();
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
// passing 0 gets zeroth webcam
cap = new Capture(0);
// adjust path to find your xml
haar = new HaarCascade(
"..\\..\\..\\..\\lib\\haarcascade_frontalface_alt2.xml");
}
}
}
如果您正在寻找裁剪图像,您可以使用名为 Face API 的 Microsoft 认知服务,它可以分隔照片上所有人的脸,它会返回一个 JSON,其中包含返回 Rectangle 结构的元素,然后您可以根据需要裁剪和调整图像大小。
在这里你可以看到更多关于它的信息:FaceAPI
您可以在http://deteksiwajah.blogspot.com/上查看人脸检测和裁剪软件的示例。它是开源的并使用 OpenCV 库。