Opencv 基于特征物体识别器的人脸识别
我对EMGUCV很陌生。我想做一个人脸识别系统,我已经实现了,但是结果是不可接受的。以下是我的识别代码: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
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