Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 基于特征物体识别器的人脸识别_Opencv_Image Processing_Computer Vision_Emgucv_Face Recognition - Fatal编程技术网

Opencv 基于特征物体识别器的人脸识别

Opencv 基于特征物体识别器的人脸识别,opencv,image-processing,computer-vision,emgucv,face-recognition,Opencv,Image Processing,Computer Vision,Emgucv,Face Recognition,我对EMGUCV很陌生。我想做一个人脸识别系统,我已经实现了,但是结果是不可接受的。以下是我的识别代码: public List<Person> RecognizeFaces(List<Image<Bgr, byte>> faces) { List<Person> RecognizedPersons = new List<Person>(); MCvTermCriteria termCrit = new

我对EMGUCV很陌生。我想做一个人脸识别系统,我已经实现了,但是结果是不可接受的。以下是我的识别代码:

public List<Person> RecognizeFaces(List<Image<Bgr, byte>> faces)
{
        List<Person> RecognizedPersons = new List<Person>();
        MCvTermCriteria termCrit = new MCvTermCriteria(TrainDB.Count, 0.001);

        EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
         this.ToGrayList(this.TrainDB),
         labels.ToArray(),
         7000,  // I changed this argument many times but nothing has changed (1000, 2000, ...
         ref termCrit);

        string label = "";
        for (int i = 0; i < faces.Count; i++)
        {
            label = recognizer.Recognize(faces[i].Convert<Gray, byte>());
            RecognizedPersons.Add(new Person(faces[i],!label.Equals("") ? label : "unknown"));
        }

        return RecognizedPersons;
}
公共列表识别面(列表面)
{
List RecognizedPersons=新列表();
MCvTermCriteria termCrit=新的MCvTermCriteria(TrainDB.Count,0.001);
特征对象识别器识别器=新的特征对象识别器(
此.ToGrayList(此.TrainDB),
labels.ToArray(),
7000,//我多次更改此参数,但没有任何更改(10002000。。。
参考termCrit);
字符串标签=”;
对于(int i=0;i
此函数从输入图像中获取先前检测到的人脸列表,并返回类型为
Person
的列表,其中每个人都包含一个图像和一个标签给识别出的人。 我的问题是为什么结果不好?我的代码是否有问题?或者培训集
TrainDB
有问题,如果有,创建培训集时应遵循的最佳准则是什么

我根据以下内容收集了培训集: 1-对包含一个人的图像应用人脸检测(使用EMGU) 2-然后我将检测到的面调整为200:W,200:H

我的训练集中的一些图像:

测试图像的一些示例:

  • 列表项


我的最后一个问题..Emgu/OpenCv是用于人脸识别的强大工具吗?还是有其他更精确的工具?

您的训练集应该具有相同的大小(尺寸)和灰度图像

List<Image<Gray, byte>>
列表

您能告诉我们您尝试检测的人脸的捕获方法吗?您只是给它位图并要求它识别吗?您需要做的是首先进行人脸检测,您可以使用相同的库,例如:

我已经在我的训练数据中加入了5张独特的脸(每张脸和标签各一张),它非常擅长检测。所以你不需要每人20多张图片,但我想这会有很大帮助

   face = new HaarCascade("haarcascade_frontalface_default.xml"); //You will need an XML training file 
   gray = MyImage.Convert<Gray, Byte>();
   MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face,1.2, 10,
      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
      new Size(20, 20));
face=new HaarCascade(“HaarCascade\u frontalface\u default.xml”);//您需要一个xml培训文件
gray=MyImage.Convert();
MCvAvgComp[][]面检测=灰色。检测ARCASCADE(面,1.2,10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_prunting,
新尺寸(20,20));
其中MyImage是您的实际文件(作为同一类的图像对象)。您可以在此处阅读有关Haar级联对象检测的内容:

因此,假设您的facesDetected数组中现在只有一张脸(当MyImage中有多张脸时,第二维度索引找到的脸的总数):

face=MyImage.Copy(facesDetected[0][0].rect).Convert().Resize(100100,
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
现在,您有了一个已调整大小并已转换的面,您可以使用。因此,在捕获所有训练数据的标准化面后,将其保存到图像数组中,将标签保存在字符串数组中,并使用以下命令识别该面:

    MCvTermCriteria termCrit = new MCvTermCriteria(TrainingImages.Length, 0.001);
    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                       TrainingImages, //as Image<Gray, byte>[] array
                       TrainingImageLabels, //as string[] array
                       3000,
                       ref termCrit);
                    name = recognizer.Recognize(result);
                    // Name will contain the recognised label
MCvTermCriteria termCrit=新的MCvTermCriteria(TrainingImages.Length,0.001);
特征对象识别器识别器=新的特征对象识别器(
TrainingImages,//作为Image[]数组
TrainingImageLabels,//作为字符串[]数组
3000,
参考termCrit);
名称=识别器。识别(结果);
//名称将包含已识别的标签

在我的例子中,当你有经过预训练的图像时,这种方法相当有效。这种方法的工作原理类似于统计,我试图找出识别器是否能够返回某种程度的置信度,我可以用它来拒绝建议的名称。但是,我希望这能帮助你!

t的大小是多少训练集?训练集中有多少名受试者,每个受试者有多少张图像?测试图像的姿势/闪电状态/面部表情是否与训练图像相同?@GilLevi训练集的大小是15。我有3个人,每人5张图像。并非所有测试图像都处于相同的姿势/闪电状态但是面部表情与上传测试图像的方法相同。对于每个测试图像,您是首先检测人脸并应用人脸识别,还是对整个输入图像进行人脸识别?@GilLevi否,先生,首先我对输入图像应用人脸检测,然后对返回的结果应用人脸识别每人5英镑绝对不够。20英镑,也许吧。
    MCvTermCriteria termCrit = new MCvTermCriteria(TrainingImages.Length, 0.001);
    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                       TrainingImages, //as Image<Gray, byte>[] array
                       TrainingImageLabels, //as string[] array
                       3000,
                       ref termCrit);
                    name = recognizer.Recognize(result);
                    // Name will contain the recognised label