开源软件满足机器人视觉开发人员的广泛需求
本文是关于视觉引导机器人的 AspenCore 特别项目的一部分。
机器人视觉应用可能会带来一系列复杂的需求,但开源库已准备好为几乎所有需求提供解决方案。开发人员可以找到从基本图像处理和对象识别到运动规划和碰撞避免的开源软件包,并且在一篇简短的文章中给出了他们的全部应有的内容。不过,这里有一些关键的开源图像处理包,可以帮助开发人员实现复杂的机器人系统。 (注意:本报告侧重于更基本的基于图像的算法的库,并明确排除了基于 AI 的机器人视觉的开源软件。)
没有任何关于机器人视觉软件的文章不能不突出开源计算机视觉库 (OpenCV) [来源]。在可用的开源软件包中,OpenCV 可能是使用最广泛且功能最丰富的。 OpenCV 发行版实现了 2,500 多种算法,解决了一系列模块中的图像处理要求,其中包括以下内容:
核心,定义了所有其他模块使用的基本数据结构和函数;
imgproc,提供图像处理功能,包括线性和非线性图像过滤、几何图像变换、色彩空间转换、直方图等;
视频,支持运动估计、背景减法和对象跟踪算法;
calib3d,提供基本几何算法、相机校准、物体姿态估计等;
features2d,提供特征检测器、描述符和描述符匹配;
objdetect,提供对象和预定义类实例的检测;
OpenCV 用 C++ 编写,可提供 C++、Python、Java 和 Matlab 的接口,并支持 Windows、Linux、Android 和 Mac OS。除了支持单指令多数据 (SIMD) 指令集外,OpenCV 还通过其 gpu 模块为许多功能提供基于 CUDA 的 GPU 加速,并通过其 ocl 模块提供 OpenCL 加速。最近发布的 OpenCV 4.0 带来了许多性能改进和功能,包括流行的 Kinect Fusion 算法的实现。
对于其功能,OpenCV 需要的学习曲线超出了希望通过机器人视觉快速移动的开发人员的耐心。对于这些开发人员,基于 Python 的 SimpleCV [source] 可能是答案。 SimpleCV 基于 OpenCV 构建,提供高级机器人视觉开发人员所需的功能,但提供可访问的框架,帮助经验不足的开发人员通过简单的 Python 函数调用探索基本的机器视觉功能。例如,开发人员可以使用 SimpleCV Image 类中的简单内置方法(下面列表中的 img.binarize())快速实现图像阈值等常用功能,最终显示如图 1 所示的结果。
from SimpleCV import Image, Color, Display # 做一个函数,做一半一半的图像.def halfsies(left,right):result =left # 将右边的图像裁剪到右边。 crop =right.crop(right.width/2.0,0,right.width/2.0,right.height) # 现在将裁剪粘贴到左侧图像上。 result =result.blit(crop,(left.width/2,0)) # 返回结果。 return result# 从 imgur.img 加载图像 =Image('http://i.imgur.com/lfAeZ4n.png')# 使用阈值 90# 将图像二值化# 并反转 results.output =img.binarize( 90).invert()# 创建并排图像 image.result =halfsies(img,output)# 显示结果 image.result.show()# 将结果保存到文件中.result.save('juniperbinary.png' )
图 1. 上面列出的 Python 代码的结果(来源:SimpleCV)
除了基本的图像处理功能外,OpenCV 和 SimpleCV 还实现了许多高级图像处理算法,机器人系统需要这些算法来处理物体或在其物理环境中安全运行。许多这些计算中使用的基本数据结构之一是点云——代表对象的多维数据点的集合(图 2)。从相机获取的对象点云用于基本的机器人操作,例如对象识别、对齐和拟合。为了处理点云,点云库 (PCL) [来源] 实现了用于过滤、拟合、关键点提取、分割等的算法。
图 2. 基本环面的点云数据集。 (来源:维基共享资源/基夫)。
物联网技术