怎样使用OpenCV进行人脸识别

作者&投稿:道裴 (若有异议请与网页底部的电邮联系)
怎样使用OpenCV进行人脸识别~

昨天刚回答过,修改下错别字放上来了。
不知道你说的人脸识别是识别出来是某个人还是只是在图像中检测出人脸。
刚用opencv完成对自己的人脸识别,但是还需要继续优化。说一下大致步骤吧:

1、首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型。人脸检测模型opencv是自带的,但是识别模型需要自己训练。下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程序简化工作量。
2、把数据标记好之后就是opencv的事情。训练的函数非常简单。只有下面这三句:


Ptr model = createEigenFaceRecognizer();
model->train(images, labels);
model->save("MyFacePCAModel.xml");


3、然后打开摄像头进行人脸检测,就是框出人脸的位置。人脸检测模型是opencv自带的。


CascadeClassifier cascade;
cascade.load("haarcascade_frontalface_alt.xml");


这是加载的方法。
cascade.detectMultiScale(gray, faces,
1.1, 2, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
| CV_HAAR_SCALE_IMAGE,
Size(30, 30));


这是检测的方法。这里检测得到的就是一个一个的人脸的矩形框,然后用画矩形的方法把它们画出来就行了。
4、然后就是对检测到的人脸进行识别了,用我们刚才训练好的人脸模型。加载:


Ptr modelPCA = createEigenFaceRecognizer();
modelPCA->load("MyFacePCAModel.xml");


预测:
int predictPCA = 0;
if (face.rows >= 120)
{
resize(face, face_test, Size(92, 112));
}
if (!face_test.empty())
{
predictPCA = modelPCA->predict(face_test);
}


如果预测结果等于标记结果,说明识别正确。

大致流程就这样了,如果你对opencv有了一定的了解,应该能看懂了。

1、首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型。人脸检测模型opencv是自带的,但是识别模型需要自己训练。下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程序简化工作量。
2、把数据标记好之后就是opencv的事情。训练的函数非常简单。只有下面这三句:
Ptr model = createEigenFaceRecognizer();
model->train(images, labels);
model->save("MyFacePCAModel.xml");

3、然后打开摄像头进行人脸检测,就是框出人脸的位置。人脸检测模型是opencv自带的。
CascadeClassifier cascade;
cascade.load("haarcascade_frontalface_alt.xml");

这是加载的方法。
cascade.detectMultiScale(gray, faces,
1.1, 2, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
| CV_HAAR_SCALE_IMAGE,
Size(30, 30));


这是检测的方法。这里检测得到的就是一个一个的人脸的矩形框,然后用画矩形的方法把它们画出来就行了。
4、然后就是对检测到的人脸进行识别了,用我们刚才训练好的人脸模型。加载:
Ptr modelPCA = createEigenFaceRecognizer();
modelPCA->load("MyFacePCAModel.xml");

检测:
int predictPCA = 0;
if (face.rows >= 120)
{
resize(face, face_test, Size(92, 112));
}
if (!face_test.empty())
{
predictPCA = modelPCA->predict(face_test);
}

如果预测结果等于标记结果,说明识别正确。

大致流程就这样了,如果你对opencv有了一定的了解,应该能看懂了。

  友情提示,要看懂代码前,你得先知道OpenCV的安装和配置,会用C++,用过一些OpenCV函数。基本的图像处理和矩阵知识也是需要的。[gm:我是箫鸣的注释]由于我仅仅是翻译,对于六级才过的我,肯定有一些翻译错的或者不当的地方,所以请大家纠错。

  1.1.介绍Introduction

  从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在OpenCV的opencv\modules\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)

  

  目前支持的算法有

  Eigenfaces特征脸createEigenFaceRecognizer()

  Fisherfaces createFisherFaceRecognizer()

  LocalBinary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer()

  下面所有的例子中的代码在OpenCV安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。

  

  1.2.人脸识别Face Recognition

  对人类来说,人脸识别很容易。文献[Tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?David Hubel和TorstenWiesel向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在[Kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献[Bru92]中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。

  

  特征脸方法在文献[TP91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题[BHK97]。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。

  近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(Gabor Waelets)([Wiskott97]),离散傅立叶变换(DiscreteCosinus Transform,DCT)([Messer06]),局部二值模式(LocalBinary Patterns,LBP)([AHP04])。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。

  1.3.人脸库Face Database

  我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http://face-rec.org/databases/)下载一个。

  AT&TFacedatabase又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

  

  YaleFacedatabase A ORL数据库对于初始化测试比较适合,但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。

  坏消息是它不可以公开下载,可能因为原来的服务器坏了。但我们可以找到一些镜像(比如 theMIT)但我不能保证它的完整性。如果你需要自己剪裁和校准图像,可以阅读我的笔记(bytefish.de/blog/fisherfaces)。

  

  ExtendedYale Facedatabase B 此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。

  1.3.1. 准备数据
  我们从网上下了数据,下了我们需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。

  /path/to/image.ext;0

  假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样。我们对下载的ORL数据库进行标识,可以获取到如下结果:

  ./at/s1/1.pgm;0
  ./at/s1/2.pgm;0
  ...
  ./at/s2/1.pgm;1
  ./at/s2/2.pgm;1
  ...
  ./at/s40/1.pgm;39
  ./at/s40/2.pgm;39
  想象我已经把图像解压缩在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根据自己的情况修改替换即可。一旦你成功建立CSV文件,就可以像这样运行示例程序:

  facerec_demo.exe D:/data/at.txt
  1.3.2 Creating the CSV File

  你不需要手工来创建一个CSV文件,我已经写了一个Python程序来做这事。

  [gm:说一个我实现的方法

  如果你会cmd命令,或者称DOS命令,那么你打开命令控制台。假设我们的图片放在J:下的Faces文件夹下,可以输入如下语句:

  J:\Faces\ORL>dir /b/s *.bmp > at.txt
  然后你打开at.txt文件可能看到如下内容(后面的0,1..标签是自己加的):

  。。。。
  J:\Faces\ORL\s1\1.bmp;0
  J:\Faces\ORL\s1\10.bmp;0
  J:\Faces\ORL\s1\2.bmp;0
  J:\Faces\ORL\s1\3.bmp;0
  J:\Faces\ORL\s1\4.bmp;0
  J:\Faces\ORL\s1\5.bmp;0
  J:\Faces\ORL\s1\6.bmp;0
  J:\Faces\ORL\s1\7.bmp;0
  J:\Faces\ORL\s1\8.bmp;0
  J:\Faces\ORL\s1\9.bmp;0
  J:\Faces\ORL\s10\1.bmp;1
  J:\Faces\ORL\s10\10.bmp;1
  J:\Faces\ORL\s10\2.bmp;1
  J:\Faces\ORL\s10\3.bmp;1
  J:\Faces\ORL\s10\4.bmp;1
  J:\Faces\ORL\s10\5.bmp;1
  J:\Faces\ORL\s10\6.bmp;1
  。。。。
  自然还有c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)

  ]

  特征脸Eigenfaces

  我们讲过,图像表示的问题是他的高维问题。二维灰度图像p*q大小,是一个m=qp维的向量空间,所以一个100*100像素大小的图像就是10,000维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(Principal Component Analysis,PCA)是KarlPearson (1901)独立发表的,而 Harold Hotelling (1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA方法寻找数据中拥有最大方差的方向,被称为主成分。

  算法描述Algorithmic Description
  令 2 表示一个随机特征,其中 3 .

  计算均值向量 4
  5
  

  计算协方差矩阵 S
  6
  

  计算 的特征值7 和对应的特征向量 8 9
  

  对特征值进行递减排序,特征向量和它顺序一致. K个主成分也就是k个最大的特征值对应的特征向量。
  x的K个主成份:

  10

  

  其中11 .

  PCA基的重构:

  12

  

  其中 13 .

  然后特征脸通过下面的方式进行人脸识别:

  A. 把所有的训练数据投影到PCA子空间

  B. 把待识别图像投影到PCA子空间

  C. 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。

  还有一个问题有待解决。比如我们有400张图片,每张100*100像素大小,那么PCA需要解决协方差矩阵 14的求解,而X的大小是10000*400,那么我们会得到10000*10000大小的矩阵,这需要大概0.8GB的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献 [Duda01]中有描述。

  [gm:这个PCA还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]

  

  OpenCV中使用特征脸Eigenfaces in OpenCV
  给出示例程序源代码

  #include "opencv2/core/core.hpp"
  #include "opencv2/contrib/contrib.hpp"
  #include "opencv2/highgui/highgui.hpp"
  
  #include <iostream>
  #include <fstream>
  #include <sstream>
  
  usingnamespace cv;
  usingnamespace std;
  
  static Mat norm_0_255(InputArray _src) {
  Mat src = _src.getMat();
  // 创建和返回一个归一化后的图像矩阵:
  Mat dst;
  switch(src.channels()) {
  case1:
  cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1);
  break;
  case3:
  cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3);
  break;
  default:
  src.copyTo(dst);
  break;
  }
  return dst;
  }
  //使用CSV文件去读图像和标签,主要使用stringstream和getline方法
  staticvoid read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator =';') {
  std::ifstream file(filename.c_str(), ifstream::in);
  if (!file) {
  string error_message ="No valid input file was given, please check the given filename.";
  CV_Error(CV_StsBadArg, error_message);
  }
  string line, path, classlabel;
  while (getline(file, line)) {
  stringstream liness(line);
  getline(liness, path, separator);
  getline(liness, classlabel);
  if(!path.empty()&&!classlabel.empty()) {
  images.push_back(imread(path, 0));
  labels.push_back(atoi(classlabel.c_str()));
  }
  }
  }
  
  int main(int argc, constchar*argv[]) {
  // 检测合法的命令,显示用法
  // 如果没有参数输入则退出!.
  if (argc <2) {
  cout <<"usage: "<< argv[0]<<" <csv.ext> <output_folder> "<< endl;
  exit(1);
  }
  string output_folder;
  if (argc ==3) {
  output_folder = string(argv[2]);
  }
  //读取你的CSV文件路径.
  string fn_csv = string(argv[1]);
  // 2个容器来存放图像数据和对应的标签
  vector<Mat> images;
  vector<int> labels;
  // 读取数据. 如果文件不合法就会出错
  // 输入的文件名已经有了.
  try {
  read_csv(fn_csv, images, labels);
  } catch (cv::Exception& e) {
  cerr <<"Error opening file \""<< fn_csv <<"\". Reason: "<< e.msg << endl;
  // 文件有问题,我们啥也做不了了,退出了
  exit(1);
  }
  // 如果没有读取到足够图片,我们也得退出.
  if(images.size()<=1) {
  string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
  CV_Error(CV_StsError, error_message);
  }
  // 得到第一张照片的高度. 在下面对图像
  // 变形到他们原始大小时需要
  int height = images[0].rows;
  // 下面的几行代码仅仅是从你的数据集中移除最后一张图片
  //[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
  Mat testSample = images[images.size() -1];
  int testLabel = labels[labels.size() -1];
  images.pop_back();
  labels.pop_back();
  // 下面几行创建了一个特征脸模型用于人脸识别,
  // 通过CSV文件读取的图像和标签训练它。
  // T这里是一个完整的PCA变换
  //如果你只想保留10个主成分,使用如下代码
  // cv::createEigenFaceRecognizer(10);
  //
  // 如果你还希望使用置信度阈值来初始化,使用以下语句:
  // cv::createEigenFaceRecognizer(10, 123.0);
  //
  // 如果你使用所有特征并且使用一个阈值,使用以下语句:
  // cv::createEigenFaceRecognizer(0, 123.0);
  //
  Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
  model->train(images, labels);
  // 下面对测试图像进行预测,predictedLabel是预测标签结果
  int predictedLabel = model->predict(testSample);
  //
  // 还有一种调用方式,可以获取结果同时得到阈值:
  // int predictedLabel = -1;
  // double confidence = 0.0;
  // model->predict(testSample, predictedLabel, confidence);
  //
  string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
  cout << result_message << endl;
  // 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法:
  Mat eigenvalues = model->getMat("eigenvalues");
  // 同样可以获取特征向量:
  Mat W = model->getMat("eigenvectors");
  // 得到训练图像的均值向量
  Mat mean = model->getMat("mean");
  // 现实还是保存:
  if(argc==2) {
  imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
  } else {
  imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
  }
  // 现实还是保存特征脸:
  for (int i =0; i < min(10, W.cols); i++) {
  string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
  cout << msg << endl;
  // 得到第 #i个特征
  Mat ev = W.col(i).clone();
  //把它变成原始大小,为了把数据显示归一化到0~255.
  Mat grayscale = norm_0_255(ev.reshape(1, height));
  // 使用伪彩色来显示结果,为了更好的感受.
  Mat cgrayscale;
  applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
  // 显示或者保存:
  if(argc==2) {
  imshow(format("eigenface_%d", i), cgrayscale);
  } else {
  imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
  }
  }
  // 在一些预测过程中,显示还是保存重建后的图像:
  for(int num_components =10; num_components <300; num_components+=15) {
  // 从模型中的特征向量截取一部分
  Mat evs = Mat(W, Range::all(), Range(0, num_components));
  Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1));
  Mat reconstruction = subspaceReconstruct(evs, mean, projection);
  // 归一化结果,为了显示:
  reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
  // 显示或者保存:
  if(argc==2) {
  imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
  } else {
  imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
  }
  }
  // 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入:
  if(argc==2) {
  waitKey(0);
  }
  return0;
  }


如何用OpenCV训练自己的分类器
(4)创建正样本vec文件 由于haarTraining训练的时候需要输入的正样本是vec文件,所以需要使用createsamples程序来将正样本转换为vec文件。打开OpenCV安装目录下bin文件夹里面的名为createSamples(新版本的OpenCV里面改名为opencv_createSamples)的可执行程序。需要提醒的是,该程序应该通过命令行启动(可以参考我的...

如何利用opencv进行样本训练
首先,利用样本(大约几百幅样本图片)的 harr 特征进行分类器训练,得到一个级联的boosted分类器。分类器中的"级联"是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器, 这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即...

如何学习opencv比较有效率?求个opencv老师。
《OpenCV教程——基础篇》北航出版社 北航的虚拟现实实验室许多师生都在使用opencv,有相当多的经验,这书质量相当不错,简单易上手。附带的光盘中代码可靠性相当高,有些直接就是某些算法或问题的实现。2.然后是学习方法。程序工具的学习与其他课程相当不同。如果为了考试,你大可不必理会这一套,根据考...

我想学OpenCV,需要一些什么样的基础
这个教程很好,从安装OpenCV到各个模块的学习,都有简明扼要的讲解和例子源代码(很多可以从OpenCV自带例程中找到)。有些函数如果不熟悉,可以到“中文文档”子模块(http:\/\/www.opencv.org.cn\/opencvdoc\/2.3.2\/html\/index.html)去查。当然,你可以在论坛上注册个帐号,和别人交流等等。推荐一本书《...

5用python进行OpenCV实战之图像变换2(旋转)
15-17: 采用同样的方法将图像逆时针旋转90度,然后展示出来 18-20: 在第18行我们使用了:imutils这个自己写的库,然后调用了rotate()方法。第一个参数是需要操作的图像,第二个参数是要旋转的度数。在imutils.py中我们自定义rotate函数 1-4: 我们的旋转方法又四个参数,第一个是图像,第...

opencv中怎么样读取图像的部分图像
OpenCV中用于读取图像像素点的值的方法很多,这里主要提供了两种常用的方法。方法一 利用IplImage数据类型的imageData定位数据缓冲区来实现,imageData包含指向图像第一个像素数据的指针 例:If( imgSource != 0 )\/\/imgSource为IplImage { for ( int i = 0; i < imgSource->height; ++i ){ ucha...

OPENCV图像识别-求思路
看到你这个图片 首先我感觉你这个偏绿的问题 是因为你错误的把摄像头传回来的YCbCr色彩空间的图像用rgb来显示了,或者就是你rgb弄成了bgr显示,先调整一下图像读取显示的问题 呵呵 另外 就你这个贴出来的图片,肯定是受到摄像头的限制,有扭曲的问题,找找摄像头标定的代码,先恢复到正常的图像,然后再...

opencv怎么样实现缩放图像不失真?
用高级的算法。具体要依据你是否保留边缘信息,还是着重给人看。缩放除非是极简单的图像(整个图像都是一种颜色)外,都会发生失真,只是这种失真是否是可以接受而已。小波插值,双三次一般自己用的话就可以比较好的保留信息。更复杂的方法请继续百度。 opencv已实现的最复杂的方法 就是 双三次。

python里的opencv用法和c一样吗?在哪里看用法呢?
opencv的api对于每种语言都是一样的啊。pyhton中opencv的用法在官网有说明文档。你可以去看看。官方文档:http:\/\/docs.opencv.org\/trunk\/doc\/py_tutorials\/py_tutorials.html 国内也有人写了些使用经验:http:\/\/www.cnblogs.com\/cutepig\/archive\/2009\/04\/17\/1437653.html ...

学习OPENCV准备来做图像处理,感觉像用matlab一样,感觉没什么意思,那 ...
看你想做什么了,想找工作,自然是用C完成的代码意义更高,以后可能也会用得着,大多数算法在实现的速度上肯定是C比matlab快,想实现算法发论文,就用matlab,界面美观,图表清晰,而且操作容易。

六盘水市18338901017: 怎样使用OpenCV进行人脸识别 -
正胞当归: 1、首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型.人脸检测模型opencv是自带的,但是识别模型需要自己训练.下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程...

六盘水市18338901017: opencv怎么实现人脸识别活体检测? -
正胞当归: 调用opencv训练好的分类器和自带的检测函数检测人脸人眼等的步骤简单直接:1.加载分类器,当然分类器事先要放在工程目录中去.分类器本来的位置是在*\opencv\sources\data\haarcascades(harr分类器,也有其他的可以用,也可以自己训练)2.调用detectmultiscale()函数检测,调整函数的参数可以使检测结果更加精确.3.把检测到的人脸等用矩形(或者圆形等其他图形)画出来.

六盘水市18338901017: 如何使用opencv做面部识别 -
正胞当归: 现在主流的很少使用opencv去做人脸识别,都是使用深度学习,找一些适合自己应用场景的深度学习框架去训练算法.opencv目前更多的是用来做显示.

六盘水市18338901017: 做人脸识别,用OpenCV怎么实现从一张图片里 -
正胞当归: 例程中就有这个例子.但是只是检测人脸区域.你要是想输出单独的人脸照片需要你自己Crop一下.例子程序中你可以获取人脸区域的坐标.

六盘水市18338901017: 如何在Android studio中成功运行opencv人脸识别的例子 -
正胞当归: 1.介绍Introduction 从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验.本文既介绍代码使用,又介绍算法原理.(他写的源代码,我们可以在OpenCV的opencv\modules\contrib\doc\facerec\src下找到...

六盘水市18338901017: opencv人脸识别用哪种方法比较好?Eigenfaces?Fisherfaces?LBP? -
正胞当归: 在视频流中进行人脸检测,把检测出的人脸送入识别系统中进行人脸识别,并给出识别信息:是陌生人;是已经注册的.linux环境下先配置好opencv吧.

六盘水市18338901017: 用opencv做人脸识别 如何识别陌生人? -
正胞当归: 如果某个识别对象和训练库中的某一个很匹配,那么就会有很高的相似度.如果识别对象不在训练库中,那么就算是返回了结果,相似度也不会很高,只不过是数值上的最优解. 所以,设置一个相似度的阀值(THREADHOLD), 最匹配误差(leastDistSq)大于这个阀值就可以判断为不在训练库中! ... if ( leastDistSq > THREADHOLD ) {return -1;} return iNearest; }

六盘水市18338901017: 最近在研究人脸识别这块,请问opencv自带的分类器是如何进行人脸检测的? -
正胞当归: 人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值.当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的.OpenCV有已经自带了人脸的Haar特征分类器.OpenCV安...

六盘水市18338901017: opencv怎样判断一副图片上是否有人脸 -
正胞当归: CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,1.1, 2, 0,cvSize(100, 60) /*级联分类器训练中采用的检测目标的尺寸*/);//检测人脸返回矩形人脸/*使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域...

六盘水市18338901017: 如何用opencv读取avi视频并在界面截图进行人脸检测
正胞当归: 打开一个avi文件相当容易..但是你后面那个要求就比较有难度了.. 你可以使用 camshift 或者 TrackerBlob那6个模块来实现.. cvCaptureFromCAM函数从摄像头采集 cvCaptureFromAVI函数从指定路径打开媒体文件 打开媒体文件后需要调用函数cvQueryFrame一帧一帧的来显示..

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网