13.7、Opencv应用--人脸识别

13.7.1、概述

wiki:http://wiki.ros.org/opencv_apps

源码:https://github.com/ros-perception/opencv_apps.git

大部分代码最初取自https://github.com/Itseez/opencv/tree/master/samples/cpp

功能包:~/software/library_ws/src/opencv_apps

该功能包订阅的话题是【/image】,我们要做的是打开相机节点,写一个将相机的话题转成【/image】节点将【/image】话题发布出来。

开启相机并发布【/image】话题的节点的路径:

opencv_apps 程序提供各种节点,这些节点在内部运行opencv的功能,并将结果发布到ROS话题中。使用opencv_apps程序时,按照自身的业务需求,只需运行一个launch文件即可,这样就可以不必再编写这些功能的程序代码。

ROS Wiki中有相关的节点解析,相应节点的话题订阅与话题发布、相关参数介绍等。详情请查看ROS WiKi。

13.7.2、使用

第一步:启动相机

【usb_cam-test.launch】文件默认开启【web_video_server】节点,可以直接使用【IP:8080】网页实时查看图像。

第二步:启动人脸识别的功能

ros+opencv应用几乎每个案例都会有一个参数【debug_view】,布尔类型,是否使用Opencv显示图片,默认显示。

如果不需要显示则设置为【False】,例如

但是这样子启动后,有些案例肯不能通过其他方式显示出来,因为在源码中,有些【debug_view】设置为【False】,就会把图像处理给关闭掉。

13.7.3、显示方法

输入以下命令,选择对应话题

系统默认显示,无需做什么处理。

(同局域网下)再浏览器中输入IP+port,例如:

具体ip,使用自己当前虚拟机ip。

13.7.4、人脸识别显示

此案例是通过即时收集人的图像自主训练,实时识别,步骤略有复杂。

参数类型默认解析
~approximate_syncboolfalse订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。
~queue_sizeint100订阅话题的队列大小
~model_methodstring"eigen"人脸识别的方法: "eigen", "fisher" or "LBPH"
~use_saved_databooltrue从~data_dir路径下加载训练数据
~save_train_databooltrue将训练数据保存到~data_dir路径下,以便重新训练
~data_dirstring"~/opencv_apps/face_data"保存训练数据路径
~face_model_widthint190训练人脸图像的宽度
~face_model_heightint90训练人脸图像的高度
~face_paddingdouble0.1每个人脸的填充比
~model_num_componentsint0人脸识别器模型的组件数量(0被视为无限制)
~model_thresholddouble8000.0人脸识别模型阈值
~lbph_radiusint1半径参数(仅适用于LBPH方法)
~lbph_neighborsint8邻域参数(仅适用于LBPH方法)
~lbph_grid_xint8网格x参数(仅适用于LBPH方法)
~lbph_grid_yint8网格y参数(仅适用于LBPH方法)
~queue_sizeint100图像订阅者队列大小

操作步骤:

1、首先在下图冒号后面,输入人物名字:Yahboom

2、确认名字:y

3、然后将人脸放在图像中央,点击确认。

4、循环增加一张照片:y,点击确认。

5、结束图片收集,输入:n,点击确认。

6、关闭这个launch文件,重启。

如果需要录入所认识别,依次循环1~5,直到所有识别人员录入完毕,再执行第六步。

image-20210903213928003

第3步:要保证能够识别到人脸

image-20210906103107655

最终识别效果

image-20210906103143423