当前位置:网站首页>C人脸识别
C人脸识别
2022-08-08 06:11:00 【Code Writers】
一:前言
本次人脸识别技术使用到的是级联分类器
对于级联分类器,如果想要自己训练模型可以参考这篇文章
【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
//使用CV_HAAR_SCALE_IMAGE算法 图像甄别
cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
//绘制矩形
vector
//使用到容器迭代器进行遍历
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
//使用CV_HAAR_SCALE_IMAGE算法 图像甄别
cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
//绘制矩形
vector
//使用到容器迭代器进行遍历
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;
}
结果测试:
可以看出,图中汽车可以被识别框选,电动车不会被识别框选。
相比博主在上周分享的 帧差法 车辆识别 来看,本次车辆识别的准确度明显提高,因此,这种方法非常值得学习!
想了解 帧差法 车辆识别 可以阅读下面这篇文章
车辆识别 帧差法 具体步骤 手把手教学
以上,就是博主的全部内容啦!欢迎一起交流学习!
边栏推荐
猜你喜欢
随机推荐
How many times the neural network is generally trained, the neural network training time is too long
"Public Administration" exam key points and answers
Web 攻击的日志分析:初学者指南
信息传输率(Information Translate Rate,ITR)
【leetcode】剑指 Offer(专项突击版)汇总
Postman显示验证码图片(base64字符串)
Redis 的内存策略
cloud computing and cloud services, cloud computing
cnn卷积神经网络反向传播,卷积神经网络维度变化
云计算和云服务,云计算
CAP定理实例分析
预处理笔记
flex布局属性简约速记
Sqlmap + dnslog injection of repetition
Basic tools - NETCAT (Telnet - banner, transfer text message)
使用 Zap 和 W3af 进行 Web 应用程序漏洞评估
Shorthand for flex layout properties
Threads, control, communications
Style of DataGrid in wpf
Several postman features worth collecting will help you do more with less!









