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

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

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: lsd直线检测是一种基于OpenCV-Python的图像处理技术,用于检测图像中的直线。该技术使用LSD算法(Line Segment Detection)来检测图像中的直线,可以应用于许多领域,如机器人视觉、自动驾驶、医学图像处理等。LSD直线检测可以快速准确地检测图像中的直线,具有很高的实用价值。 ### 回答2: LSD直线检测是一种使用OpenCV-Python库进行图像处理的方法。LSD代表最短距离直线检测。它是一种先进的计算机视觉算法,可以在数百或数千个像素上检测出直线。该算法能够提供极高的精度和速度,特别适用于在复杂背景下检测线条。此外,这个算法还可以处理不同颜色和灰度图像。 LSD直线检测算法的基本原理是在一系列不同尺度和方向的线段上使用多个模板,包括沿着线波峰波谷的同步检测。然后使用霍夫变换对检测的直线进行筛选,去除不符合检测标准的直线。最终的结果是一组有序的直线。 在OpenCV-Python库中,我们可以使用cv2. createLineSegmentDetector()函数实现LSD直线检测。这个函数有一个参数scale,可以用来设置需要检测线条的大小。另外,这个函数还有一个可选的参数,可以设置直线的检测阈值。这样,在图像检测到的线越少,最后输出的直线越准确。另外,lsd检测还允许我们从输出中选择最长直线。 LSD直线检测在计算机视觉和机器视觉中具有广泛的应用。它可以用于检测交通信号的位置、机器人自动驾驶行驶、身份识别和安全监控等领域。此外,LSD还可以用于图像分割,在将原始图像分成几个不同的部分时非常有用。因此,LSD直线检测是一个非常实用的算法,可以为我们带来许多重要的应用。 ### 回答3: LSD直线检测是一种常用的计算机视觉算法,它可以在图像中找到直线的位置和方向。在opencv-python中,可以使用cv2.createLineSegmentDetector函数来实现LSD直线检测。 这个函数可以通过三个参数来控制检测结果。第一个参数scale设置检测的精度,取值范围在1到√2之间,值越大,则检测时间越短,但是精度降低。第二个参数sigma_scale是线检测器中使用的高斯滤波模板的比例因子,该因子决定了线检测器工作时使用的滤波模板的尺寸,sigma_scale越大,则使用的滤波模板的尺寸越大。第三个参数detect_threshold表示直线的检测阈值,控制着被检测出直线的数量和质量,越小,则检测出的直线越多,但质量可能较低。 使用LSD直线检测图像处理中有广泛的应用,比如在图像检测道路和车道线、纸张和条码边缘、图像中的直线和轮廓等。因为LSD直线检测的算法复杂度较低,相对于其它直线检测算法它的速度快,准确性较高,同时比较容易实现和使用,因此被广泛应用于实际场景中。 总之,LSD直线检测是一种简单而有效的检测算法,它能够在图像中快速发现存在的直线,应用范围广泛,值得我们在进行图像处理时进行尝试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值