当前位置:   article > 正文

C人脸识别_vj人脸检测 c语言

vj人脸检测 c语言

一:前言
本次人脸识别技术使用到的是级联分类器

对于级联分类器,如果想要自己训练模型可以参考这篇文章

【OpenCV】 级联分类器训练模型

【友情提示:训练对电脑的配置要求比较高,另外还需要有足够庞大的样本数据,因此,如果是研究生在导师实验室用着3090的,可以自己训练,但也要投入足够的时间进行数据采集。不过,这边为了方便大家学习,博主会在资源中分享 人脸识别训练模型 车辆识别训练模型 ,在读完这篇文章后,感兴趣的,想要学习的,欢迎自取】

二:人脸识别案例 实现步骤及完整代码
步骤1 灰度化处理
//灰度化处理 节省内存
Mat gray;
cvtColor(frame,gray,CV_RGB2GRAY);
步骤2 将灰度图再次进行 行列压缩
//级联分类器比帧差法还更慢,因此,需要再将灰度图大小压缩一半左右 行列压缩
Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
//按存储大小计算 压缩方式采用线性压缩
resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);
步骤3 直方图均值化
//直方图均值化 让灰度图经过直方图函数处理 黑白分明
equalizeHist(smalling,smalling);
//imshow(“smalling”,smalling);
步骤4 使用模型 对每一个像素点遍历 图像甄别
//调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历
vector faces;
//使用CV_HAAR_SCALE_IMAGE算法 图像甄别
cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));

//绘制矩形
vector ::const_iterator iter;
//使用到容器迭代器进行遍历
for(iter=faces.begin();iter!=faces.end();iter++)
{
rectangle(frame,
cvPoint(cvRound(iter->x scale),cvRound(iter->yscale)),//左上
cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),//右下
Scalar(0,255,0),2,8//颜色 像素位
);
}
imshow(“frame”,frame);
人脸识别案例 完整代码如下:
#include
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

//人脸识别
void datectFace(Mat &frame,CascadeClassifier cascade,double scale)
{
//灰度化处理 节省内存
Mat gray;
cvtColor(frame,gray,CV_RGB2GRAY);

//级联分类器比帧差法还更慢,因此,需要再将灰度图大小压缩一半左右 行列压缩
Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
//按存储大小计算 压缩方式采用线性压缩
resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);

//直方图均值化 让灰度图经过直方图函数处理 黑白分明
equalizeHist(smalling,smalling);
//imshow(“smalling”,smalling);

//调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历
vector faces;
//使用CV_HAAR_SCALE_IMAGE算法 图像甄别
cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));

//绘制矩形
vector ::const_iterator iter;
//使用到容器迭代器进行遍历
for(iter=faces.begin();iter!=faces.end();iter++)
{
rectangle(frame,
cvPoint(cvRound(iter->x scale),cvRound(iter->yscale)),//左上
cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),//右下
Scalar(0,255,0),2,8//颜色 像素位
);
}
imshow(“frame”,frame);
}

int main(int argc, char *argv[])
{
//级联分类器对象
CascadeClassifier cascade;
//读取级联分类器
cascade.load(“D:/00000cars-face/face.xml”);

Mat frame;
//视频路径的获取
VideoCapture cap(0);
while (cap.read(frame))
{
//将读到的帧进行显示
imshow(“frame”,frame);
//检测识别 图像 级联分类器 比例
datectFace(frame,cascade,2);
waitKey(3);
}
return 0;
}
结果测试:可对人脸框选识别

三:车辆识别案例 级联分类器 具体实现
如果对于上述的人脸识别案例 理解透彻 那么车辆识别也是一样的实现方法 只不过就是换了一个级联分类器 图像数据读取 罢了。

这边就直接给出 车辆识别案例 完整代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
 
//车辆识别案例
void datectCarDaw(Mat &frame,CascadeClassifier cascade,double scale)
{
    //灰度化处理 节省内存
    Mat gray;
    cvtColor(frame,gray,CV_RGB2GRAY);
 
    //级联分类器比帧差法还更慢,因此,需要再将灰度图大小压缩一半左右 行列压缩
    Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
    //按存储大小计算  压缩方式采用线性压缩
    resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);
 
    //直方图均值化 让灰度图经过直方图函数处理 黑白分明
    equalizeHist(smalling,smalling);
    //imshow("smalling",smalling);
 
    //调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历
    vector<Rect>cars;
    //使用CV_HAAR_SCALE_IMAGE算法 图像甄别
    cascade.detectMultiScale(smalling,cars,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
 
    //绘制矩形
    vector<Rect>::const_iterator iter;
    //使用到容器迭代器进行遍历
    for(iter=cars.begin();iter!=cars.end();iter++)
    {
        rectangle(frame,
                  cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),//左上
                  cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),//右下
                  Scalar(0,255,0),2,8//颜色 像素位
                    );
    }
    imshow("frame",frame);
}
 
int main(int argc, char *argv[])
{
    //级联分类器对象
    CascadeClassifier cascade;
    //读取级联分类器
    cascade.load("D:/00000cars-face/cars.xml");
 
    Mat frame;
    //视频路径的获取
    VideoCapture cap("D:/00000000000003jieduanshipincailliao/carMove.mp4");
    while (cap.read(frame))
    {
        //将读到的帧进行显示
        imshow("frame",frame);
        //检测识别 图像 级联分类器 比例
        datectCarDaw(frame,cascade,2);
        waitKey(3);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

结果测试:

可以看出,图中汽车可以被识别框选,电动车不会被识别框选。

相比博主在上周分享的 帧差法 车辆识别 来看,本次车辆识别的准确度明显提高,因此,这种方法非常值得学习!

想了解 帧差法 车辆识别 可以阅读下面这篇文章

车辆识别 帧差法 具体步骤 手把手教学

以上,就是博主的全部内容啦!欢迎一起交流学习!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/635052
推荐阅读
相关标签
  

闽ICP备14008679号