4.2 OpenCV-人体/脸检测、OpenCV-边缘检测类、OpenCV-结构分析类(冰达机器人摄像头与图像使用)

4.2摄像头与图像

4.2.1摄像头的驱动与图像查看

移动机器人端使用启动摄像头:

roslaunch robot_vision robot_camera.launch

正常启动后摄像头上的红色指示灯会亮起来

打开虚拟机在PC运行rqt工具查看图像

rqt_image_view

启动工具后即可弹出下图窗口,在红框中选择话题“/image_raw/compressed”即可查看当前摄像头的图像画面。

这里建议选择/image_raw/compressed话题是因为这个话题输出的图像会进行一个压缩可以避免带宽过大而卡顿。通过rostopic bw命令可以查看到这两个话题带宽有倍数级差异。

4.2.1b安卓ROS手机APP中查看机器人摄像头图像

首先在机器人端运行底盘控制功能包和摄像头功能包

roslaunch base_control base_control.launch

roslaunch robot_vision robot_camera.launch

按照前面章节介绍的方法用手机app连接到机器人,获取到机器人摄像头的画面。结合摇杆控制就可以实现一个第一视角的驾驶了。

4.2.2OpenCV-人体/脸检测
4.2.2.1人脸检测

机器人端运行摄像头功能包和人脸检测功能包

roslaunch robot_vision robot_camera.launch

roslaunch robot_vision face_detection.launch

PC打开rqt_image_view工具,订阅/face_detection/image/compressed,即可实现人脸检测

4.2.2.2人脸识别

机器人端三个终端中分别运行下面个节点

启动摄像头roslaunch robot_vision robot_camera.launch

启动人脸识别roslaunch robot_vision face_recognition.launch

启动人脸数据录入roslaunch robot_vision face_recognition_train.launch

启动人脸数据录入后首先给要录入的人脸取名,这里取名为‘a’

然后给人脸拍照,PC端打开rqt_image_view工具,订阅/face_detection/image/compressed来检测人脸。检测到人脸后,在人脸录入的终端按回车就给人脸拍好一张照片了。选择是否再拍一张,直接输入‘n‘不再多拍即可完成人脸录入。回到rqt_image_view工具,订阅/face_recognition/debug_image话题就可以进行人脸识别啦

4.2.2.3人体检测:

机器人端先启动摄像头功能包,然后启动人体检测节点

roslaunch robot_vision robot_camera.launch

roslaunch robot_vision people_detect.launch

打开rqt_image_view工具,订阅/people_detect/image/compressed,即可实现人体检测

4.2.3二维码AR标签位姿检测

本节内容介绍二维码标签的位姿检测,所用到的二维码图像在“ROS机器人用户资料_2021\课件文档”文件夹中有提供,使用A4纸按照1:1打印出来即可。

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动AR标签跟踪roslaunch robot_vision ar_track.launch

PC启动rviz

载入配置文件,点击File->OpenConfig。找到home->catkin_ws->src->robot_vision->config。选择这个配置文件

载入配置文件后,拿出准备好的二维码标签。可以看到,左边标识出了二维码的位置,右边标识出了二维码的远近距离

机器人端或PC新开一个终端运行rostopic echo /ar_pose_marker

可以看到这里有输出每个二维码对应的序号,以及相对于相机原点的距离信息和四元数表示的航向姿态

分布式运行的概念:所谓分布式运行就是说,ros的节点通过分布式通讯运行在同一局域网下的不同机器人上。我们先CTRL+C将机器人端AR标签跟踪节点关闭;

然后在PC启动AR标签跟踪roslaunch robot_vision ar_track.launch

此时回到PC端的rviz界面就会发现,结果跟刚才在机器人端运行AR标签跟踪一样。但是相比较刚才的画面这次有明显的卡顿现象。这是因为AR标签跟踪需要订阅image_raw这个话题,所以PC端运行时就需要先将image_raw的内容传输到PC端。而image_raw占用的带宽是非常高的,在传输过程就会因为数据丢失等问题造成卡顿。

需注意的是并非所有节点都可以在同一局域网下的不同设备上运行,例如类似rviz这种跟显示图像相关的就必须在有显示器的设备,例如PC端运行,而通过ssh远程登录的机器人是不具备显示器条件的。而跟底盘和摄像头这种硬件设备相关的节点就必须在机器人端运行,因为PC端没有底盘和相机这样的硬件。

4.2.4OpenCV-边缘检测类

4.2.4.1边缘检测

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动边缘检测roslaunch robot_vision edge_detection.launch

PC用两个终端打开两个rqt_image_view工具,分别订阅/image_raw/compressed和/edge_detection/image/compressed

左边正常的图像是两个箱子,而右边显示的就是两个箱子的边缘线条。

边缘检测可以提取图像中明暗或者颜色变化较大的图像边缘。

边缘检测可以传送参数进去,默认情况是0,可修改传进去的参数

roslaunch robot_vision edge_detection.launch edge_type:=2

可以看到纸箱已经完全看不清了,而另一个箱子金属边框和黑色箱体颜色明暗对比非常强烈的就被抽象成了一些线条。通过边缘检测将复杂的图像抽象成一些线条以后,就可以从中提取特征。

4.2.4.2霍夫直线检测

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动直线检测roslaunch robot_vision hough_lines.launch

PC端两个rqt_image_view工具分别订阅/image_raw/compressed和/hough_lines/image/compressed

4.2.4.2霍夫圆检测

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动圆形检测roslaunch robot_vision hough_circles.launch

PC端两个rqt_image_view工具分别订阅/image_raw/compressed和/hough_circles/image/compressed

4.2.5OpenCV-结构分析类

本节内容演示OpenCV中结构分析类demo的应用

4.2.5.1 find_contours轮廓检测

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动轮廓检测roslaunch robot_vision find_contours.launch

PC两个rqt_image_view工具分别订阅/image_raw/compressed和/find_contours/image/compressed

可以看到轮廓检测是将整个手掌的轮廓都描绘出来了,它和前面介绍的边缘检测是有区别的。边缘检测是将边缘的线条描绘出来,而轮廓检测是将整个轮廓显示出来了。

这里我们重新打开一个动态调参工具rosrun rqt_reconfigure rqt_reconfigure

选择find_contours在右侧可以动态调节参数来改变图像效果

4.2.5.2 general_contours轮廓检测

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动一个通用的轮廓检测roslaunch robot_vision general_contours.launch

rqt_image_view工具订阅/general_contours/image/compressed

这个节点不再描绘具体的轮廓,而是通过矩形将轮廓包围出来。当我们需要对图片进行分析时,需要将图片提取出来。而在上一个例程当中,获取到的具体轮廓是一个不规则图形它是无法提取成一张图片的。而这个节点描绘的方框可以被截取获得一张新的图片。

我们输出一下矩形描述相关的话题

rostopic echo /general_contours/rectangles

这里会输出矩形的中心和长宽摆放的角度,这样就可以根据这些信息去图像内截取矩形。

4.2.5.3 凸包检测 convex_hull

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

机器人端启动凸包检查roslaunch robot_vision convex_hull.launch

rqt_image_view工具订阅/convex_hull/image/compressed

凸包就是将最外层的点连接起来构成凸多边形,这种方式介于轮廓检测和通用轮廓检测之间。这个多边形不会存在内凹,这样能用最小的面积围出轮廓所在区域。

4.2.5.3 图像矩计算 Contour_Moments

机器人端启动摄像头roslaunch robot_vision robot_camera.launch

PC启动图像计算roslaunch robot_vision contour_moments.launch debug_view:=true

图像计算的应用会启动一个图像化的调试窗口(右侧)

机器人端或PC运行rostopic echo /contour_moments/moments

这个话题会输出对图像的一些计算包括重心,中心,周长,面积等。

相关推荐

  1. OpenCV图像滤波、边缘检测

    2024-04-21 07:20:05       21 阅读
  2. Python-OpenCV-边缘检测

    2024-04-21 07:20:05       22 阅读
  3. Python-OpenCV-边缘检测

    2024-04-21 07:20:05       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 07:20:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 07:20:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 07:20:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 07:20:05       20 阅读

热门阅读

  1. 开发语言漫谈-React

    2024-04-21 07:20:05       17 阅读
  2. 常用数据结构及设计

    2024-04-21 07:20:05       13 阅读
  3. 开发语言漫谈-脚本语言

    2024-04-21 07:20:05       13 阅读