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。
第一步:启动相机
xxxxxxxxxx
roslaunch 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的功能
xxxxxxxxxx
roslaunch 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】,例如
xxxxxxxxxx
roslaunch opencv_apps contour_moments.launch debug_view:=False
但是这样子启动后,有些案例肯不能通过其他方式显示出来,因为在源码中,有些【debug_view】设置为【False】,就会把图像处理给关闭掉。
输入以下命令,选择对应话题
xxxxxxxxxx
rqt_image_view
系统默认显示,无需做什么处理。
(同局域网下)再浏览器中输入IP+port,例如:
xxxxxxxxxx
192.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步:要保证能够识别到人脸
最终识别效果