赞
踩
目录
本次人脸识别技术使用到的是级联分类器
对于级联分类器,如果想要自己训练模型可以参考这篇文章
【友情提示:训练对电脑的配置要求比较高,另外还需要有足够庞大的样本数据,因此,如果是研究生在导师实验室用着3090的,可以自己训练,但也要投入足够的时间进行数据采集。不过,这边为了方便大家学习,博主会在资源中分享 人脸识别训练模型 车辆识别训练模型 ,在读完这篇文章后,感兴趣的,想要学习的,欢迎自取】
- //灰度化处理 节省内存
- 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);
- #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;
- }
结果测试:
可以看出,图中汽车可以被识别框选,电动车不会被识别框选。
相比博主在上周分享的 帧差法 车辆识别 来看,本次车辆识别的准确度明显提高,因此,这种方法非常值得学习!
想了解 帧差法 车辆识别 可以阅读下面这篇文章
以上,就是博主的全部内容啦!欢迎一起交流学习!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。