私は顔認識プログラムをコーディングしようとしましたが、コミュニティからの助けが必要です。以下に投稿されたコードはエラーなしでコンパイルされましたが、レコグナイザーが機能していないようですか?基本的にtarget.jpgには、pic1.jpg(内部に3人)から切り取った人物が含まれているため、認識機能はそれをより簡単に検出できるはずです。
以下のコードはエラーなしで実行されますが、pic1.jpgの3人すべてがボックス化され、3つの顔すべてのGetEigenDistancesは0です。正しくはpic1.jpgの人(target.jpgの人)のみがボックス化されます。
私がどこで間違っているのかについて何か考えはありますか?前もって感謝します。
私はc#2010Expressでemgucv2.4を使用しています
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using Emgu.CV.CvEnum;
namespace FaceReco
{
    public partial class Form1 : Form
    {
        private HaarCascade haar;
        List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>();
        Image<Gray, byte> TrainedFace, UnknownFace = null;
        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d);
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // adjust path to find your XML file 
            haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml");
            //Read an target image
            Image TargetImg = Image.FromFile(Environment.CurrentDirectory + "\\target\\target.jpg");
            Image<Bgr, byte> TargetFrame = new Image<Bgr, byte>(new Bitmap(TargetImg));
            //FACE DETECTION FOR TARGET FACE
            if (TargetImg != null)   // confirm that image is valid
            {
                //convert the image to gray scale
                Image<Gray, byte> grayframe = TargetFrame.Convert<Gray, byte>();
                var faces = grayframe.DetectHaarCascade(haar, 1.4, 4,
                                        HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                        new Size(25, 25))[0];
                foreach (var face in faces)
                {
                    //add into training array
                    TrainedFace = TargetFrame.Copy(face.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
                    trainingImages.Add(TrainedFace);
                    break;
                }
                TargetImageBox.Image = TrainedFace;
            }
            //Read an unknown image
            Image UnknownImg = Image.FromFile(Environment.CurrentDirectory + "\\img\\pic1.jpg");
            Image<Bgr, byte> UnknownFrame = new Image<Bgr, byte>(new Bitmap(UnknownImg));
            //FACE DETECTION PROCESS
            if (UnknownFrame != null)   // confirm that image is valid
            {
                //convert the image to gray scale
                Image<Gray, byte> grayframe = UnknownFrame.Convert<Gray, byte>();
                //Detect faces from the gray-scale image and store into an array of type 'var',i.e 'MCvAvgComp[]'
                var faces = grayframe.DetectHaarCascade(haar, 1.4, 4,
                                        HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                        new Size(25, 25))[0];
                //draw a green rectangle on each detected face in image
                foreach (var face in faces)
                {
                    UnknownFace = UnknownFrame.Copy(face.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
                    MCvTermCriteria termCrit = new MCvTermCriteria(16, 0.001);
                    //Eigen face recognizer
                    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(trainingImages.ToArray(), ref termCrit);
                    // if recognise face, draw green box
                    if (recognizer.Recognize(UnknownFace) != null)
                    {
                        UnknownFrame.Draw(face.rect, new Bgr(Color.Green), 3);
                    }
                    float f = recognizer.GetEigenDistances(UnknownFace)[0];
                    // display threshold
                    UnknownFrame.Draw(f.ToString("R"), ref font, new Point(face.rect.X - 3, face.rect.Y - 3), new Bgr(Color.Red));
                }
                //Display the image
                CamImageBox.Image = UnknownFrame;
            }
        }
    }
}