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】话题的节点的路径:
~/yahboomcar_ws/src/yahboomcar_visual/scripts/pub_image.py
opencv_apps 程序提供各种节点,这些节点在内部运行opencv的功能,并将结果发布到ROS话题中。使用opencv_apps程序时,按照自身的业务需求,只需运行一个launch文件即可,这样就可以不必再编写这些功能的程序代码。
ROS Wiki中有相关的节点解析,相应节点的话题订阅与话题发布、相关参数介绍等。详情请查看ROS WiKi。

第一步:启动相机
xxxxxxxxxxroslaunch yahboomcar_visual opencv_apps.launch img_flip:=false如果是Jetson相机,则需要将pub_image_csi.py改成pub_image.py

【usb_cam-test.launch】文件默认开启【web_video_server】节点,可以直接使用【IP:8080】网页实时查看图像。
第二步:启动Opencv_apps的功能
xxxxxxxxxxroslaunch opencv_apps face_recognition.launch # 人脸识别roslaunch opencv_apps corner_harris.launch # harris角点检测roslaunch opencv_apps camshift.launch # 目标追踪算法roslaunch opencv_apps convex_hull.launch # 多边形轮廓roslaunch opencv_apps discrete_fourier_transform.launch # 离散傅里叶变换算法roslaunch opencv_apps edge_detection.launch # 边缘检测算法 roslaunch opencv_apps face_detection.launch # 人脸检测算法roslaunch opencv_apps fback_flow.launch # 光流检测算法 roslaunch opencv_apps find_contours.launch # 轮廓检测roslaunch opencv_apps general_contours.launch # 一般轮廓检测roslaunch opencv_apps goodfeature_track.launch # 特征点追踪roslaunch opencv_apps hls_color_filter.launch # HLS颜色过滤roslaunch opencv_apps hough_circles.launch # 霍夫圆检测roslaunch opencv_apps hough_lines.launch # 霍夫直线检测roslaunch opencv_apps hsv_color_filter.launch # HSV颜色过滤roslaunch opencv_apps lk_flow.launch # LK光流算法roslaunch opencv_apps people_detect.launch # 人体检测算法roslaunch opencv_apps phase_corr.launch # 相位相关位移检测 roslaunch opencv_apps pyramids.launch # 图像金字塔采样算法roslaunch opencv_apps rgb_color_filter.launch # RGB颜色过滤roslaunch opencv_apps segment_objects.launch # 清除背景检测算法roslaunch opencv_apps smoothing.launch # 简单过滤器roslaunch opencv_apps threshold.launch # 阈值图像处理roslaunch opencv_apps watershed_segmentation.launch # 分水岭分割算法几乎每个功能案例都会有一个参数【debug_view】,布尔类型,是否使用Opencv显示图片,默认显示。
如果不需要显示则设置为【False】,例如
xxxxxxxxxxroslaunch opencv_apps contour_moments.launch debug_view:=False但是这样子启动后,有些案例肯不能通过其他方式显示出来,因为在源码中,有些【debug_view】设置为【False】,就会把图像处理给关闭掉。
输入以下命令,选择对应话题
xxxxxxxxxxrqt_image_view
系统默认显示,无需做什么处理。
(同局域网下)再浏览器中输入IP+port,例如:
xxxxxxxxxx192.168.2.79:8080
移动画面,观察现象。



阈值越低,线条越多,画面越容易卡。

相机移动越快,圆的半径越大。

使用鼠标选中不同物体,系统自动区分出来。

本节每个案例都会有一个订阅图像和发布图像的话题。
| 参数 | 类型 | 默认 | 解析 |
|---|---|---|---|
| ~use_camera_info | bool | true | 订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。 |
| ~debug_view | bool | false | 是否创建窗口显示该节点图像 |
| ~edge_type | int | 0 | 指定边缘检测方法:0:索贝尔算子,1:拉普拉斯算子,2:Canny边缘检测 |
| ~canny_threshold1 | int | 100 | 指定第二个canny阈值 |
| ~canny_threshold2 | int | 200 | 指定第一个canny阈值 |
| ~apertureSize | int | 3 | 索贝尔算子的孔径大小。 |
| ~apply_blur_pre | bool | True | 是否将blur()应用于输入图像 |
| ~postBlurSize | double | 3.2 | 输入图像孔径大小 |
| ~apply_blur_post | bool | False | 是否将GaussianBlur()应用于输入图像 |
| ~L2gradient | bool | False | canny的参数 |
| ~queue_size | int | 3 | 队列大小 |


| 参数 | 类型 | 默认 | 解析 |
|---|---|---|---|
| ~use_camera_info | bool | true | 订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。 |
| ~debug_view | bool | false | 是否创建窗口显示该节点图像 |
| ~canny_low_threshold | int | 0 | Canny边缘检测低阈值 |
| ~queue_size | int | 3 | 队列大小 |

此案例是通过即时收集人的图像自主训练,实时识别,步骤略有复杂。
| 参数 | 类型 | 默认 | 解析 |
|---|---|---|---|
| ~approximate_sync | bool | false | 订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。 |
| ~queue_size | int | 100 | 订阅话题的队列大小 |
| ~model_method | string | "eigen" | 人脸识别的方法: "eigen", "fisher" or "LBPH" |
| ~use_saved_data | bool | true | 从~data_dir路径下加载训练数据 |
| ~save_train_data | bool | true | 将训练数据保存到~data_dir路径下,以便重新训练 |
| ~data_dir | string | "~/opencv_apps/face_data" | 保存训练数据路径 |
| ~face_model_width | int | 190 | 训练人脸图像的宽度 |
| ~face_model_height | int | 90 | 训练人脸图像的高度 |
| ~face_padding | double | 0.1 | 每个人脸的填充比 |
| ~model_num_components | int | 0 | 人脸识别器模型的组件数量(0被视为无限制) |
| ~model_threshold | double | 8000.0 | 人脸识别模型阈值 |
| ~lbph_radius | int | 1 | 半径参数(仅适用于LBPH方法) |
| ~lbph_neighbors | int | 8 | 邻域参数(仅适用于LBPH方法) |
| ~lbph_grid_x | int | 8 | 网格x参数(仅适用于LBPH方法) |
| ~lbph_grid_y | int | 8 | 网格y参数(仅适用于LBPH方法) |
| ~queue_size | int | 100 | 图像订阅者队列大小 |
操作步骤:
1、首先在下图冒号后面,输入人物名字:Yahboom
2、确认名字:y
3、然后将人脸放在图像中央,点击确认。
4、循环增加一张照片:y,点击确认。
5、结束图片收集,输入:n,点击确认。
6、关闭这个launch文件,重启。
如果需要录入所认识别,依次循环1~5,直到所有识别人员录入完毕,再执行第六步。

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

最终识别效果
