人脸识别Project

openCV 基础函数和类

OpenCV环境配置及测试

预热:
1、环境配置 
  在系统环境变量path中 追加路径:C:\openCV\install\x86\mingw\bin
2、配置工程文件pro:
  INCLUDEPATH += C:\openCV\install\include
  INCLUDEPATH += C:\openCV\install\include\opencv
  INCLUDEPATH += C:\openCV\install\include\opencv2
  LIBS += C:/openCV/install/x86/mingw/lib/libopencv_*.a
3、头文件
  #include 
  using namespace cv;
4、测试Code
  int main(int argc, char *argv[])
  {
      Mat src, dst;
      src = imread("1.jpg");
      if (!src.data) {
          printf("could not load image...\n");
          return -1;
      }
      namedWindow("input image", CV_WINDOW_AUTOSIZE);
      imshow("input image", src);
      waitKey(0); 
      return 0;
  }
备注:我的QT版本是5.4.0

以下开启OpenCV的学习!!!

Mat类

OpenCV中表示图像的类
计算机“眼中”的图片(二维数组)

创建对象
Mat src;
重要属性
Mat src;
src.clos; //获取图像的宽度
src.rows;//获取图像的高度
src.channels();//获取图像的通道数,表示一个像素点的数组元素的个数,比如:BGR的图片通道数是3
常用函数
功能:加载图像
  Mat imread( const String& filename, int flags = IMREAD_COLOR );
  参数1:图片的路径
  参数2:图像的色彩空间模式(默认为BGR)
  返回值:图像对象

功能:在窗口显示图像
  void imshow(const String& winname, const ogl::Texture2D& tex);
  参数1:窗口名称
  参数2:图像对象Mat就可以

功能:转换图像色彩空间   色彩空间(一个像素点的组成)
  void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
  参数1:输入图像
  参数2:输出图像
  参数3:色彩空间  详情ColorConversionCodes
  参数4:通道数,默认根据色彩空间决定

常用来将BGR转成Gray,灰度图虽然难看,但是保留了原图像的所有特征,提升效率。

flip();//图片翻转
resize();//
Mat类转换到QImage

通常情况下需要在QT上显示图片,因此了解Mat(BGR)转换QImage(RGB)非常必要

Mat src;
Mat dst;
执行操作步骤:
1、色彩空间转换
  cvtColor(src,dst,CV_BGR2RGB);
2、QImage img(dst.data, dst.cols, dst.rows, dst.cols*rgb.channels(), QImage::Format_RGB888);
    QImgae构造函数的参数说明:
      参数1:存放图片数据的数组
      参数2:图片的列数
      参数3:图片的行数
      参数4:每一行的通道数
      参数5:图片的编码格式
3、可以在Qt上显示了
  ui->show_label->setPixmap(QPixmap::fromImage(img));

VideoCapture视频类

常用函数
功能:打开视频
  bool open(const String& filename);
  参数1:视频路径;参数传整数0,表示打开摄像头
  返回值:打开成功

功能:读取视频帧
  VideoCapture& operator >> (CV_OUT Mat& image);
  参数1:读取到Mat对象
  返回值:VideoCapture对象

矩阵掩膜

掩膜并不重要,重要的是通过掩膜我们来感受卷积,opencv对图像所有的操作几乎都是卷积
卷积:对图片中的每个像素点进行特定的操作
有什么用呢?
可以提升图片的对比度,对比美颜相机(降低对比度)

常用函数
功能:获取图像像素指针
Mat src; 
uchar* p = src.ptr(i) 获取图像像素的指针,i表示第i行
这里的指针p偏移一个单位是偏移了一个通道,而不是一个像素点,对于3通道的图片,p需要偏移3次才能指向下调一个像素点

功能:获取通道数
src.channels()

功能:获取位图深度 
src.depth()
位图深度:指一个像素点的通道的值,占了几个二进制位

功能:像素范围处理  
saturate_cast(num) 将数字参数num的值限制的类型参数的范围内,如果num超出最小值范围,
函数返回最小值,超出最大值范围,函数返回最大值。

功能:掩膜公式
矩阵的掩膜操作十分简单,就是掩膜来计算每个像素的像素值,从而提升对比对,掩膜(mask也被称作kernel)
I(i,j) = 5*I(i,j)-[I(i+1,j)+I(i-1,j)+I(i,j+1)+I(i,j-1)]

功能:对RGB图修改像素值
  Vec3b val = img.at(i, j);
  img.at(y,x)[0]=128; // blue
  img.at(y,x)[1]=128; // green
  img.at(y,x)[2]=128; // red
或者
    Vec3b v(255, 255, 255);
    src.at(j,i) = v;//一次性给返回值的三个通道赋值

Rect类

矩形
void rectangle(    Mat& img,        //背景图片
                   Rect rec,            //矩形的范围
                   const Scalar& color,     //颜色
                   int thickness = 1,           //线条宽度
                   int lineType = LINE_8,
                                    //线条类型LINE_4  LINE_8  LINE_AA(反锯齿)
                   int shift = 0);              //点坐标中小数位数
截图,对感兴趣区域选择
Mat src;
Rect rect(100, 100, 200, 400);
//参数1 矩形左上角x 
//参数2 矩形左上角y 
//参数3 矩形宽 
//参数4 矩形高
Mat dst = src(rect);
//这里是()的运算符重载,从src中截取rect部分的图片放到dst里

级联分类器

理论上可以查找任何事物

训练模型文件采用OpenCV自带的
路径:C:/openCV/install/etc/haarcascades/haarcascade_frontalface_alt2.xml

识别:
  通过多级筛选在图片中寻找目标

注意:1、不要每次都创建新的对象,重复加载模型不合理
      2、加载很多个脸怎么回事 detectMultiScale参数是不是写错了
cv::CascadeClassifier类 _初始化级联分类器
CascadeClassifier classifier = CascadeClassifier(const String& filename);
参数:训练模型的文件路径
人脸检测函数_detectMultiScale
void detectMultiScale(
                 InputArray image,
                  //待检测的灰度图,需要预先进行直方图均值化来提升对比度
                 CV_OUT std::vector& objects,//查找到的目标矩形输出
                 double scaleFactor = 1.1,//前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%,这个值越大,某些尺寸的对象无法被检测,但检测更快
                 int minNeighbors = 3, 
                  //有多少个重叠的检测标记才被认为有效
                 int flags = 0, //新的级联分类器没用
                 Size minSize = Size(),//目标最小尺寸
                 Size maxSize = Size() );//目标最大尺寸,可以排除不合理对象,大大提升识别效率

机器学习_人脸识别器

1、机器学习的作用:根据提供的图片模型通过算法生成数据模型,从而在其他图片中查找相关的目标
2、人脸识别的两种常见算法
1.Fisher
输入数据-->减去均值-->计算离散矩阵-->计算特征值与特征向量-->计算前K个最大特征值对应特征向量-->投影到子空间-->终止

2.LBPH
开始-->图像灰度化-->LBP特征提取-->ULBP降维处理-->分割为多个方格-->每个方格生成直方图-->直方图连接特征向量集合-->直方图比较-->得到分类结果
FaceRecognizer类

opencv提供的人脸识别器基类,LBPHFaceRecognizer是根据LBPH算法实现的识别器类.

  • 头文件
#include   //人脸识别器
using namespace cv::face;
  • 创建对象
//创建空的人脸识别器对象
Ptr recognizer = LBPHFaceRecognizer::create();
//根据已有的模型创新人脸识别器对象
Ptr recognizer = FaceRecognizer::load("模型文件.xml");

机器学习

_更新模型
void update(
        InputArrayOfArrays src, //图片模型数组  vector  
        InputArray labels);//标签数组,每个模型识别后的标签 vector

_保存模型
void save(const String& filename);

_预测目标
void predict(InputArray src, //预测图形
             int &label,        //预测后的标签,学习时对应的标签
             double &confidence) const;//可信度
使用定时器说明

由于UI界面不能出现死循环之类的,否则就卡住了
因此考虑使用定时器 。

你可能感兴趣的:(人脸识别Project)