使用opencv进行人脸识别的三种方法(【OpenCV】 人脸识别)
目录
一:前言
二:人脸识别案例 实现步骤及完整代码
步骤1 灰度化处理
步骤2 将灰度图再次进行 行列压缩
步骤3 直方图均值化
步骤4 使用模型 对每一个像素点遍历 图像甄别
人脸识别案例 源码分享
结果测试:可对人脸框选识别
三:车辆识别案例 级联分类器 具体实现
一:前言
本次人脸识别技术使用到的是级联分类器
对于级联分类器 ,如果想要自己训练模型可以参考这篇文章
【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<Rect>faces; //使用CV_HAAR_SCALE_IMAGE算法 图像甄别 cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30)); //绘制矩形 vector<Rect>::const_iterator iter; //使用到容器迭代器进行遍历 for(iter=faces.begin();iter!=faces.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);人脸识别案例 源码分享
#include <iostream> #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<Rect>faces; //使用CV_HAAR_SCALE_IMAGE算法 图像甄别 cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30)); //绘制矩形 vector<Rect>::const_iterator iter; //使用到容器迭代器进行遍历 for(iter=faces.begin();iter!=faces.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/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; }结果测试:
可以看出,图中汽车可以被识别框选 ,电动车不会被识别框选。
相比博主在上周分享的 帧差法 车辆识别 来看 ,本次车辆识别的准确度明显提高 ,因此 ,这种方法非常值得学习!
想了解 帧差法 车辆识别 可以阅读下面这篇文章
车辆识别 帧差法 具体步骤 手把手教学
以上 ,就是博主的全部内容啦!欢迎一起交流学习!
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!