• 【OpenCV】 人脸识别


    目录

    一:前言

    二:人脸识别案例 实现步骤及完整代码

    步骤1 灰度化处理

    步骤2 将灰度图再次进行 行列压缩 

    步骤3 直方图均值化

    步骤4 使用模型 对每一个像素点遍历 图像甄别

    人脸识别案例 完整代码如下:

    结果测试:可对人脸框选识别

    三:车辆识别案例 级联分类器 具体实现


    一:前言

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

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

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

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

    二:人脸识别案例 实现步骤及完整代码

    步骤1 灰度化处理

    1. //灰度化处理 节省内存
    2. Mat gray;
    3. cvtColor(frame,gray,CV_RGB2GRAY);

    步骤2 将灰度图再次进行 行列压缩 

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

    步骤3 直方图均值化

    1. //直方图均值化 让灰度图经过直方图函数处理 黑白分明
    2. equalizeHist(smalling,smalling);
    3. //imshow("smalling",smalling);

    步骤4 使用模型 对每一个像素点遍历 图像甄别

    1. //调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历
    2. vectorfaces;
    3. //使用CV_HAAR_SCALE_IMAGE算法 图像甄别
    4. cascade.detectMultiScale(smalling,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
    5. //绘制矩形
    6. vector::const_iterator iter;
    7. //使用到容器迭代器进行遍历
    8. for(iter=faces.begin();iter!=faces.end();iter++)
    9. {
    10. rectangle(frame,
    11. cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),//左上
    12. cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),//右下
    13. Scalar(0,255,0),2,8//颜色 像素位
    14. );
    15. }
    16. imshow("frame",frame);

    人脸识别案例 完整代码如下:

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

    结果测试:可对人脸框选识别

    三:车辆识别案例 级联分类器 具体实现

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

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

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

    结果测试:

     

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

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

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

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

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

     

  • 相关阅读:
    Windows下ANSI与UTF8之间转换,wstring与string之间的转换代码片段
    vue中watch如何对对象进行深度监听
    【python】用Pillow操作图片
    未来的产品经理,需要什么样的原型设计工具?
    2023中国计算机大会:蚂蚁集团连发两支百万级科研基金
    技术架构 - 应用数据分离,应用服务集群架构
    二维码智慧门牌管理系统:强化地址管理,推动政府业务协同
    springboot使用redisTemplate操作lua脚本
    【记录】celery + mongodb 动态添加、更新定时任务时间
    开源社区赋能,Walrus 用户体验再升级
  • 原文地址:https://blog.csdn.net/m0_56051805/article/details/126188407