8

サイズ変更された画像と何とか何とか何とかを提供するC#で書いてHttpHandlerいます...問題ありません。参照として使用するハンドラーが何百万もあります。

問題は、4:3と16:9の「従来の」サイズでユーザーの写真を撮ったことです。ただし、このハンドラーは写真IDサイズ(4cm x 3cm)で画像を提供する必要があり、明らかにユーザーの顔の周りをトリミングする必要があります。顔の位置は大きく異なります(常に画像の中央にあるとは限りません)。

では、どのようなアルゴリズムを使用して顔の中心を検出し、この点の周りの画像をトリミングできるでしょうか。

4

3 に答える 3

10

EmguCV(OpenCVのDotNetポート)でHaarCascadeクラスを使用できますhttp://www.emgu.com/wiki/index.php/Face_detection

この例を実行するための注意事項:

  • 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");
        }
    }
}
于 2011-09-10T00:20:41.147 に答える
3

画像のトリミングをお探しの場合は、FaceAPIという名前のMicrosoftCognitive Serviceを使用して、写真上のすべての人物の顔を区切ることができます。これにより、Rectangle構造体を返す要素を含むJSONが返されます。必要に応じて画像を切り抜いてサイズを変更します。

ここでそれについてのより多くの情報を見ることができます:FaceAPI

于 2016-09-12T06:05:40.687 に答える
2

http://deteksiwajah.blogspot.com/で、顔検出およびトリミングソフトウェアの例を見ることができます。これはオープンソースであり、OpenCVライブラリを使用しています。

于 2011-11-16T23:08:05.447 に答える