4、ROS+Opencv应用

4.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。

image-20210903181852659

4.2、使用

4.2.1、启动

第一步:启动相机

如果是Jetson相机,则需要将pub_image_csi.py改成pub_image.py

 

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

第二步:启动Opencv_apps的功能

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

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

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

4.2.2、显示方法

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

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

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

4.2.3、效果显示

移动画面,观察现象。

image-20210903215736978

image-20210903215933659

image-20210903220054380

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

image-20210903220336691

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

image-20210903220246064

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

image-20210903220528108

4.3、节点

本节每个案例都会有一个订阅图像和发布图像的话题。

4.3.1、边缘检测算法

参数类型默认解析
~use_camera_infobooltrue订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。
~debug_viewboolfalse是否创建窗口显示该节点图像
~edge_typeint0指定边缘检测方法:0:索贝尔算子,1:拉普拉斯算子,2:Canny边缘检测
~canny_threshold1int100指定第二个canny阈值
~canny_threshold2int200指定第一个canny阈值
~apertureSizeint3索贝尔算子的孔径大小。
~apply_blur_preboolTrue是否将blur()应用于输入图像
~postBlurSizedouble3.2输入图像孔径大小
~apply_blur_postboolFalse是否将GaussianBlur()应用于输入图像
~L2gradientboolFalsecanny的参数
~queue_sizeint3队列大小

image-20220219122359784

image-20210903212947694

4.3.2、轮廓矩

参数类型默认解析
~use_camera_infobooltrue订阅【camera_info】这个话题,获得默认坐标系ID,否则直接使用图像信息。
~debug_viewboolfalse是否创建窗口显示该节点图像
~canny_low_thresholdint0Canny边缘检测低阈值
~queue_sizeint3队列大小

image-20220219122556604

4.3.3、人脸识别

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

参数类型默认解析
~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