OpenCV开发笔记

OpenCV 简介

参考:
https://www.jianshu.com/p/3d90dbfad6c5

1.下载和配置

下载地址:

https://opencv.org/releases.html

下载说明:不同的平台下载不同的安装包,这里用VS开发所以下载windows环境下的开发包。(用VS方便查看效果,后期还会讲怎么移植到android平台)

会下载一个 .exe文件,双击安装,会在 安装目录下生成 opencv文件夹,这里面就是我们要用到的库了。

VS中的配置:
1.新建一个CMAKE项目 
2.在cmakeList中加入opencv的头文件:include_directories(安装目录/build/include)
3.在cmakeList中加入opencv的库文件:link_directories(安装目录/build/x64/vc15/lib)
4.target_link_libraries(自己的库 opencv_world343d)
5.引用动态库    安装目录/build/x64/vc15/bin/opencv_world343d.dll
  我的项目里是放置在 C:/Users/Administrator/CMakeBuilds/4f3cda46-de27-a13d-92ca-74fd97e44be6/build/x64-Debug/项目名称   下
6.引用头文件:  include 
  引用namespace  using namespace cv;

用下面的一段测试代码可以打开查看一张图片:
Mat p = imread(图片路径);
imshow("12345",p);
waitKey();

2.简单的人脸识别代码

知识点 LBP和检测原理:

LBP

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有多分辨率、灰度尺度不变、旋转不变等特性。主要用于特征提取中的纹理提取。

使用LBP作为人脸检测的特征提取方式具有:计算量小;存储空间小;计算过程简单,没有复杂的除法和特殊运算,便于硬件实现;检测的时间短,检测的实时性好。

LBP的核心思想就是:以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征。

OpenCV开发笔记_第1张图片
lbp.jpg

基本LBP

原始的LBP算子定义为在3*3的窗口内,处理83这个像素点的lbp值:
将83与包围83的8个位置进行比较。如果大于83则取值为1,否则为0,然后将这些数据顺时针组合在一起,这样的到一个01111100,即:0x7C(124)。这就是83位置的lbp值。顺序并无硬性要求,只要在同一处理中保持相同的顺序即可。提取的LBP算子在每个像素点都可以得到一个LBP值,对一幅图像提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)这种图片称之为lbp图谱。

检测原理

将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBPH(LBP特征的统计直方图)。 每个子区域就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成 之后,将图片和人脸的直方图进行相似性比较。

直方图:

把图片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。用横轴代表0-255的亮度数值。竖轴代表照片中对应亮度的像素数量,这个函数图像就被称为直方图。

简单来说,图像的直方图是用来表现图像中亮度分布的情况,给出的是图像中某个亮度或者某个范围亮度下共有几个像素

OpenCV开发笔记_第2张图片
直方图.jpg
调用摄像头:
VideoCapture video(0);
Mat img;
while (1) {
  video >> img;
  imshow("摄像头",img);
  waitKey(10);
}
人脸定位(定位一个图片上的人脸):
//创建分类器
CascadeClassifier classifiter;
// 加载分类模型
if (!classifiter.load("路径/lbpcascade_frontalface.xml")) {
  return -1;
}

Mat img   = imread("xx.jpg");;
// Mat 的颜色空间是BGR
// 1.把图像转化成灰色,方便进行降噪处理
Mat img1;
cvtColor(img, img1, COLOR_BGR2GRAY);
// 2.增强对比度(直方图均衡)
Mat img2;
equalizeHist(img1, img2);
//3.定位人脸 N个
classifiter.detectMultiScale(img2,faces);
for (auto face : faces) {
    // 画矩形              指定BGRA的颜色
    rectangle(img,  face,  Scalar(255,0,255));
}

这个时候可以用 imgshow(img)查看定位的结果

(摄像头中)人脸追踪:

1.头文件中创建class CascadeDetectorAdapter

#include 
#include 


using namespace cv;

class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:
    CascadeDetectorAdapter(cv::Ptr detector) :
        IDetector(),
        Detector(detector) {

        CV_Assert(detector);
    }

    void detect(const cv::Mat &Image, std::vector &objects)
    {

        Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);

    }

    virtual ~CascadeDetectorAdapter()
    {

    }

private:
    CascadeDetectorAdapter();
    cv::Ptr Detector;
};

2.修改定位中的代码:

   /**
    *   显示摄像头的图像
    */
    //智能指针
    Ptr classifier = makePtr("路径/lbpcascade_frontalface.xml");
    //创建一个跟踪适配器  用来定位
    Ptr mainDetector = makePtr(classifier);

    Ptr classifier1 = makePtr("路径/lbpcascade_frontalface.xml");
    //创建一个跟踪适配器  用来跟踪
    Ptr trackingDetector = makePtr(classifier1);

    //拿去用的跟踪器
    DetectionBasedTracker::Parameters DetectorParams;
    Ptr tracker = makePtr(mainDetector, trackingDetector, DetectorParams);
    //开启跟踪器
    tracker->run();

    VideoCapture capture(0);
    Mat img;
    Mat gray;
    while (1)
    {
        capture >> img;
        // img的 颜色空间是 BGR,不像现在,早期的计算机中主流是bgr,而不是rgb
        cvtColor(img, gray, COLOR_BGR2GRAY);
        //增强对比度 (直方图均衡)
        equalizeHist(gray, gray);
        std::vector faces;
        //定位人脸 N个
        tracker->process(gray);
        tracker->getObjects(faces);
        //classifier->detectMultiScale(gray, faces);
        for (Rect face : faces) {
            //画矩形
            //分别指定 bgra
            rectangle(img, face, Scalar(255, 0, 255));
        }
        imshow("摄像头", img);
        //延迟30ms 如果30s内你没有输入 空格 
        waitKey(30);
    }
    //关闭跟踪器
    tracker->stop();

3.人脸追踪和训练讲解

你可能感兴趣的:(OpenCV开发笔记)