OpenCV与机器视觉基本理论解析
1 1 视频中的车流量统计 初次接触图像处理,要追溯到2011年华中赛区大学生数学建模竞赛。当时有一道题目很有意思:提供了一段约五分钟的道路交通视频,要求利用数学模型来统计视频中的车流量。说得专业一些,就是借助数据通讯传输技术、电子控制技术、计算机处理技术等手段,对视频进行分析与处理,提取关键信息,
1.1 视频中的车流量统计
初次接触图像处理,要追溯到2011年华中赛区大学生数学建模竞赛。当时有一道题目很有意思:提供了一段约五分钟的道路交通视频,要求利用数学模型来统计视频中的车流量。说得专业一些,就是借助数据通讯传输技术、电子控制技术、计算机处理技术等手段,对视频进行分析与处理,提取关键信息,以便于报警、记录、分析等。不过本题的主要任务仅仅是统计视频中的车辆总数。查阅资料后发现,MATLAB自带了视频提取与图像处理工具箱,而且数字图像在计算机中本质上是M×N×P的矩阵,P代表通道数,例如RGB图像通道数为3,灰度图像通道数为1。
MATLAB在矩阵运算方面具有天然优势,再加上此前学过MATLAB课程,因此选择它来建模。有一个小细节:使用MATLAB加载视频时频繁失败,需要安装xvid解码器才能够正常运行。安装完成后,MATLAB便能读取视频文件的基本信息,比如文件名、文件大小、时长、帧率FPS、总帧数等。
对于每一帧图像,可获取的信息是:一个288(高)×352(宽)×3(RGB)的三维像素矩阵,每个数据取值范围0~255,用无符号8位整数表示颜色值。例如点(50,50)处的像素值为(0,0,0)代表黑色,(255,255,255)代表白色,(255,0,0)代表红色。每个点的颜色由红、绿、蓝三种基本色按不同比例混合而成。考虑到三维矩阵处理较为繁琐且数据量较大,先对图像进行预处理,例如转换为灰度图像或二值化图像。

常见的灰度图像处理方式,是对某个像素点的RGB值进行算术平均或其他加权计算,这样图像的通道数由3降为1,计算量大幅减少。而二值化图像则是在灰度图像基础上继续处理:高于某个阈值的像素点设为1,低于阈值的设为0,最终图像矩阵中只包含0和1,非黑即白。很明显,转换为灰度后图像更清晰,而二值化处理后颜色较深的车辆容易被忽略。因此,最终选择对每一帧图像进行灰度处理。
对于车流量统计,常用算法包括背景差分法、帧差法、边缘检测法、灰度比较法等。其中:帧差法是将相邻两帧图片相减,按车道设置固定窗口检测运动车辆信息,对环境光线变化不敏感,但车辆换道或相邻车道车辆部分覆盖检测窗时容易产生误检。边缘检测法能在不同光照条件下检测到车辆边缘,但若车辆颜色较暗或处于阴影中,边缘模糊,可能出现漏检。灰度比较法通过比较路面与车辆的灰度值判断是否有车,算法简单、计算量小、易于实现,但受光线影响较大。
当时时间紧张,未能深入钻研这些方法,于是想到一个简单直接的策略。仔细分析了每一帧图像:拍摄角度固定,图像尺寸固定,车道在图像中的位置也固定,只有车辆在变化。图像中车道宽度大约30个像素,车宽必然小于每个车道宽度,因此决定在每个车道上绘制一条黑色实线,称为虚拟检测线。如下图所示。

检测线的选取需要讲究:基本设置在靠近摄像头的位置,距离太远会导致车道和车辆变得模糊。同时,不同车道的检测线不在同一条线上,但相距不能过远,以防止车辆变道。随后循环遍历当前帧与前一帧在检测线上像素值是否发生变化——若有变化,说明有车辆经过。但并非检测到变化就立即计数,因为车辆实际通过检测线的过程中,图像像素会产生微小变化,例如车窗颜色与车头或车尾的差异。因此还需要考虑车辆完全通过后,前后两帧图像像素不再变化。具体判断车辆是否完全通过,需要引入一个累计值。
当第一次出现变化时,设置一个标识符(flag),然后连续考察后续多帧的值是否持续变化,并且对每个车道单独统计车流量,最后累加得到总数。伪代码如下:
temp 虚拟检测线上灰度值的基准值
temp(i) 第i帧图片虚拟检测线上的灰度值
sum 统计的车辆数
T 阀值
for i=1:n 一帧一帧的比较
if |temp-temp(i)| > T 判断是否达到阀值
sum += 1; 满足条件,计数
end
end
最终通过此方法得到的结果是:该视频车辆总数为261辆,与标准答案272辆相比,误差为4.04%。分析主要原因:视频中部分车辆的颜色与路面相近,或者受光照影响,经过灰度处理后模型未能将其计入;当然也存在车辆变道时同时占据两个车道而被重复统计的情况。于是自然想到:采用双线检测线是否会提高准确率?效果如下。

仅考察一个车道,观察准确率是否提升。双线画线的逻辑与单线有所不同:
1. 上下两条检测线分别记为a、b,车辆先经过a,再经过b。
2. 两条采样线的长度均为30个像素,间距为5个像素。
3. 对于第n帧图像,仅在一条线上检测到差值变化信号不足以断定有车。只有a、b同时出现较大差值变化时,才认为当前确实有一辆车经过。
4. 同理,在一定范围内增加更多检测线可提高检测精度,但必须保证两端最外边的间距小于一般车长。
5. 具体实现中,使用两个数组standard1(1:30)和standard2(1:30)记录两条标准线上各点的灰度值。
这种双线检测方法还能粗略计算车速,用于判断是否超速:
1. 在上采样线检测到差值信号的瞬间,记录帧数n;随后下采样线检测到差值信号的瞬间,记录帧数m。
2. 每秒包含25帧图像,相邻两帧时差为0.04秒。
3. 实际中上下采样线的距离可测量,设为D。
4. 汽车通过的速度V = D / [(m-n)/25] = 25×D / (m-n)。
关于阈值的计算,由于每个车道光照不同、视角不同,采用统一的差值标准显然不可靠。因此需要根据不同车道赋予适当的阈值。为了计算每个车道的最大阈值,采用静态取点方法:在车道附近一定范围内选取一些不受车辆影响且有代表性的点,计算整个过程中这些静态点差值的变化,以变化的最大值作为该车道的阈值,最终得出阈值为50。
然而比赛时间有限(仅三天),知识面也有限,很多想法不知如何实现,许多图像处理方法也不了解。最后草草收场,好在仍获得了小奖。
1.2 赛后小感
时隔多年再回顾这次比赛,依然觉得颇为不易。当时懂的东西太少,还未到大三,许多知识都是现学现用,模型完全是自创的新方法。虽然仅针对这道题、这个特定环境,缺乏扩展性、计算实时性、误差来源分析以及多种方法比较等,也主要未曾参考论文,不知如何查阅资料。比赛期间除了技术实现,还需撰写类似“八股文”的内容,例如为何选择该模型/方法、有哪些假设或前提、模型的优缺点以及改进方案等,几乎接近学术研究论文,时间非常紧张。
不过正因如此,奠定了在图像处理与学术研究方面的基础。感觉图像处理还是挺容易上手的,尤其是在计算机中将其视为数字矩阵,所有基本方法都可以看作是对这个数字矩阵进行各种变换,从而获得不同效果,确实很有意思。
2 机器人的视觉研究
2.1 研究背景
2013年加入智能体研究基地团队(Base of Intelligent Agent Research),实验室拥有一台双轮差动的轮式移动机器人,移动平台由英集斯自动化公司提供。运动电机为24V/70W高性能空心杯MAXON电机,配备减速比33:1的减速箱,同轴安装500线光电编码器以确保电机控制精度。上位机可通过向DSP(TMS320LF2407)运动控制卡发送控制命令,驱动电机转动实现机器人移动。上位机与下位机通过RS232串口通信,示意图如下。

如今的机器人硬件系统大致都是这样搭建的(大同小异)。机器人的下位机接口已由厂商开发完成,对上位机而言,其实是一台T2350/1.86GHz/0.99GB的WinXP工控机,只需调用运动控制接口并下发速度指令即可。从系统框图可以看出,基于这个机器人平台可以进行多种研究,例如激光SLAM导航、语音识别、机器人视觉等。
此前有过比赛经验,在图像处理方面有一定基础,而且当时有一位博士师兄正在研究人脸识别,对OpenCV及其环境搭建非常熟悉,于是决定尝试研究机器人视觉。首先使用Kinect一代深度相机,安装Kinect SDK后自带一些教程,可以查看RGB图像和深度图像,也有骨骼识别、手势识别等例程。Kinect一代底座内有一个马达可调节镜头视角,类似于一根连杆支撑上面的镜头,因此移动机器人时,画面晃动明显,并且存在几百毫秒的延迟,图像质量也不理想。于是果断更换为Logitech的USB摄像头,并开始阅读《OpenCV(中文版)》(O'Reilly出版社,于仕琪团队翻译)。当时书中仍以OpenCV 1.0语法为主,使用IplImage方式操作图像,所用的版本是2.4.4,好在差异不算太大。
2.2 OpenCV基础知识
这里简要介绍图像处理的常用方法。无论是在Windows还是Ubuntu下安装OpenCV,网上都有大量教程,版本越新越好,功能越强大。安装OpenCV时可以留意它所依赖的库,例如与硬件通讯相关、图像压缩与解码等,这也是通过调用OpenCV中的API即可加载图片、摄像头或视频的原因。
2.2.1 图像/视频的基本操作
正如1.2节所述,图像在计算机中以数字矩阵的形式呈现,因此对图像的操作本质上就是对矩阵的操作。矩阵的常见操作无非是创建新矩阵、相加、相减、左乘、右乘、复制、取子矩阵等。特别是截取图像中的某一块矩阵,有一个形象的名称叫感兴趣区域(ROI,region of interest),例如选取一块矩形或椭圆区域,将其填充为黑色或白色等。因此,除了Eigen库外,OpenCV偶尔也能派上用场来处理矩阵运算。
虽然OpenCV尚未像MATLAB那样便捷地操作矩阵,但越往后API封装得越好,Mat类、imshow、imwrite、subplot等与MATLAB的语法极其相似。需要注意两点:OpenCV中存储彩色图像的顺序是BGR;图像的元素类型通常为8U(8位无符号整数,范围0~255),也可以是16S、32F等,对应C/C++中的uchar、short、float等基本数据类型。进行图像变换时,尤其要注意图像的类型,防止计算时超出范围导致程序崩溃。
此外,OpenCV提供了一些简单的回调函数用于交互,例如键盘响应事件、鼠标响应事件和滚动条控制器等。不过真正开发GUI时,这几个事件响应可能不够。最后补充一点:彩色图像使用RGB表示是因为红、绿、蓝是基本的三原色光,它们按不同比例相加可得到其他任何颜色。这种加色法广泛应用于电子系统中,也是最常见且容易理解的方式。除了RGB颜色模型,还有HSV模型(Hue表示色调,Saturation表示饱和度,Value表示明度)。OpenCV提供了API用于不同颜色模型之间的转换,对于图像增强和色调滤镜,使用HSV空间进行分析效果很好。
2.2.2 阈值分割与形态学
对灰度图像进行的阈值化操作称为灰度图像二值化,简称图像二值化,也常称为阈值分割。这是一种非常常用的处理方式。大致思路:以8U类型图像为例,若某像素值大于某个阈值T,则将其设为0,小于T的保持不变,这样较亮的区域被黑色遮盖,较暗的区域则凸显出来。图像的二值化处理不仅限于单通道灰度图像,多通道图像同样可以,得到的效果也不同。阈值分割可细分为五类:二值化、二值化反、阈值截断、阈值取零和阈值取零反,从字面即可看出区别,即对给定阈值进行不同的逻辑操作。但在绝大多数情况下,人为选定阈值较为困难,因此出现了自适应阈值方法。
先引入一个概念:图像直方图。例如对于8U图像,矩阵中所有值范围在[0,255],将0~255作为X轴,每个数值出现的次数显示在Y轴上,这样的图形就是图像直方图。实际上,这种图在手机拍照的详细信息中广泛出现。

自适应阈值方法中,OTSU和Triangle都是基于直方图分布的全局阈值计算方法。OTSU通过计算类间最大方差来确定分割阈值;Triangle三角法则基于直方图的单峰与斜边的最大距离确定阈值。因此,OTSU算法对于直方图具有两个峰、中间有明显波谷的图像二值化效果较好;Triangle三角法则对直方图呈单峰分布的图像效果较好,主要用于凸显最明显的区域,例如细胞壁检测。
图像形态学操作涉及一个结构元素,也称为滑动窗口。结构元素并非单个像素,而是一个几何形状的像素块,如矩形、十字交叉、圆形等。该结构元素从左至右、从上到下遍历整个矩阵,并按照一定规则处理结构元素对应的矩阵块内的数值。例如,当矩阵块内的数值与结构元素一致时不做处理,不一致则全部置为0,这样白色区域减少,即图像的腐蚀,如下图所示。

若对上述过程进行相反操作,则图像的白色区域扩大,即膨胀。腐蚀和膨胀还可以组合:开运算是先腐蚀后膨胀,可有效清除二值图像中小的白色噪声像素块,凸显高亮区域;闭运算是先膨胀后腐蚀,能填充二值图像中小的黑色像素,凸显灰暗区域。这些概念无需刻意记忆,具体情形具体分析即可。
其次是连通区域分析。它主要通过扫描图像中每个像素点,对像素值相同且相互连通的像素点标记为相同的标签,最终将像素点相同的区域连成一个闭合回路。扫描方式可以是自上而下、从左到右,也可以基于每个像素单元。常用方法是两步法:首先检查是否有邻域已被标记的像素点,如果有一个或多个邻域像素点已被标记,则选择最小的标记作为当前前景像素点的标记。合并过程通过检查连通等价,对连通区域替换为最小等价标记,最终得到输出。连通区域分析可用于文本分割或分析,如下图所示。

最后是轮廓提取与Blob检测。寻找轮廓即提取二值化图像中的边缘点集或对应的层次信息,然后沿着边缘连续的像素点绘制成轮廓,同样基于连通区域分析。轮廓提取在图像几何分析、对象检测与识别中非常有用。Blob检测是对图像中一组相互连通的像素点,它们具有一些共通的属性,需要将这些区域全部找出并标记。Blob检测也会调用轮廓检测方法,但更为高级,更适合检测不规则的斑点或比较复杂的连通区域,如下图所示。

2.2.3 图像滤波与变换
图像滤波主要用于去除图像中的噪声,是图像预处理的重要环节。具体处理方法是使用一个小型滤波器(例如3×3),输出中心点的像素值由周围8个像素共同决定,如下图所示。

若输出像素依赖于输入像素的线性组合,则称为线性滤波器;若输入输出是非线性的,则称为非线性滤波器。通过滤波器对图像进行的操作称为卷积,而滤波器称为卷积核。这个概念听起来高深,实际上完全可以将其看作一个滑动的窗口遍历图像,在每个小窗口内进行运算。图像的卷积与泛函分析中定义的卷积略有差别(泛函分析中卷积是通过两个函数f和g生成第三个函数的一种数学算子,即F[g(x)*f(x)] = F[g(x)]F[f(x)])。进行滤波时需要注意图像的边界,即矩阵的四个边。通常有几种方法处理边界像素卷积:零值填充、再造边界和反射边界。
图像滤波可细分为:方形/均值滤波(卷积核内所有像素对中心像素的贡献相同)、高斯滤波(邻域像素根据到中心像素的距离不同赋予不同权重)、中值滤波(基于排序统计理论,能有效抑制噪声的非线性滤波)和双边滤波(非线性、边缘保留、有效去噪声的滤波方法)。它们的区别如下:
均值滤波可对图像进行快速、简单的平滑处理,但对噪声的处理效果很差。高斯滤波是一种比均值滤波稍好的线性滤波,不会改变原图像的边缘走向。

卷积核除了用于滤波,还能对图像进行梯度操作。例如,图像从左向右看,像素值不断增大;或者从上到下看,像素值不断增大,这些都能反映图像的梯度变化。计算图像X、Y方向上的梯度可采用如下算子(也称Prewitt算子),这是一种一阶算子。

为了进一步降低噪声影响并提升梯度计算的稳定性,可先进行高斯模糊,再进行梯度计算。高斯模糊本身也是卷积操作,先高斯模糊再梯度计算相当于两步卷积。将这两步卷积合并为一步即为Sobel算子,它隐含了高斯模糊操作。经过这些梯度运算或其他形式的滤波,能够将图像中的轮廓信息凸显出来。此外还有拉普拉斯算子,是一种二阶导数滤波,能更好地提取边缘信息。图像具有求导的性质,听起来难以理解,其实与微积分中的梯度含义相同(公式也一样),因此不能死抠概念或公式,而应看到其本质和用途,多总结、类比,活学活用。
最后,一个著名的检测算法是Canny算法,分为三个步骤:1. 梯度计算;2. 非极大值抑制;3. 双阈值和边缘连接。
说完滤波,接下来是图像的几何变换。几何变换可分为仿射变换(Affine Transform)和单应性变换(Homography)两类。变换的基本操作可表述如下:

其中A表示变换矩阵,B为平移系数。因此图像几何变换也可视为坐标旋转、映射等,最终结果包括图像的放大、缩小、平移、旋转等。在OpenCV中需要给定这个变换矩阵,再使用warpAffine函数。但通常情况下我们并不知道变换矩阵,这时就需要用到单应性变换。OpenCV提供了一个稳定的估算方法,通过拟合所有相关点来求得变换矩阵:findHomography函数。图像的几何变换对于图像全景拼接和特征点匹配具有重要意义。
2.2.4 图像的特征提取
图像的特征提取是图像处理中的关键环节,也是难点所在。图像特征包括特征点及其对应的描述子,可视为图像的DNA——描述一幅图像最基本的单元,无论图像经历何种变换,特征点都不会改变。常见的图像特征提取方法有SIFT、SURF、ORB等。其中SIFT特征提取方法同时具备平移、尺度、旋转不变性,但速度较慢;SURF比SIFT计算更快;ORB主要是在快速关键点检测算法和BRIEF描述子算法的基础上改进而成,其关键点检测通过FAST算法发现关键点,再通过Harris角点检测与金字塔提取多尺度特征。对于特征描述子,ORB使用BRIEF描述子,但BRIEF描述子在匹配时本身不具备旋转不变性,稳定性不高,因此ORB通过改进BRIEF描述子,对点对旋转生成多个查找表,实现对特征描述子的计算。
提取到特征点后,通过特征匹配来寻找不同图像中的相同部分,并标记出来。匹配方法有两种:暴力匹配和FLANN匹配,示例如下。

2.2.1~2.2.4节所描述的基本理论和算法大多提出于20世纪八九十年代甚至更早,非常成熟稳定,也是目前应用最广泛的。总结一下:数字图像处理可以看作是对矩阵的操作。例如阈值分割用于去除高像素值或低像素值的部分;形态学操作主要是一个小窗口遍历图像,对轮廓进行提取;滤波处理用于图像平滑和降噪;几何变换和特征提取则涉及至少两幅图像的操作与比较。不得不佩服前人的智慧以及数学之美。经过多年发展,网络上无论何种语言都能找到相应的实现示例。掌握这些基础知识和实践后,在多数从事图像处理或美颜的公司工作应该不成问题。
2.3 OpenCV与机器人控制结合
学习了2.2节中图像处理的常规方法,现在要应用到机器人中,还面临许多其他方面的问题需要解决。对机器人而言,图像就是它的眼睛,可开展的研究包括物体跟踪、物体识别、导航及路径规划等。
物体跟踪:物体可以是特定形状或特定颜色的,通过轮廓提取并计算轮廓半径/直径,OpenCV都提供了相应API,然后将直径作为反馈,让机器人保持与特定物体一定距离从而实现跟踪。此前有师兄们做出过demo,但这种场景单一,识别也仅限于特定物体,可扩展性不强,并非当时的研究热点。
物体识别:需要解决的关键问题在于分类和识别,即机器人对采集到的图片能够筛选出有用信息,并作出相应反应,例如抓取、语音播报、辅助定位等。机器人具备甄别能力的前提是离线训练好大量不同物体的模型并导入到机器人中,这需要借助机器学习或深度学习方法。当时深度学习尚未流行,而纯粹的图像分类进行正负样本训练,感觉与机器人关系不大。抓取也不是实验室现有平台的强项,对机械臂的研究需要深入很久,因此这个方向没有继续展开。
导航:导航对于机器人来说始终是热点话题。有地图才能定位,有定位才能规划路径,而地图需要人为构建。通常采用激光SLAM建图和导航,视觉导航难度较大(当时VSLAM也不发达)。另一种机制是学习:让机器人采集周围场景信息,然后根据场景输出运动信息(如速度、位置等)。这种方法不仅要用到图像处理方法,还需结合机器学习,最后应用到机器人中,是一个不错的方向。
图像的数据量通常很大,例如640×480的彩色图像,每一帧包含的像素点达921,600个。因此降维非常关键,且降维后的关键信息仍需保留。容易想到的方法包括灰度化、滤波去噪、压缩、PCA、特征提取等。对于运动中的机器人,它看到的场景如下:

然后,将采集到的图像和机器人运动信息输入一种机器学习算法IHDR,该算法能生成一种树形结构的数据库。当机器人再次处于场景中时,通过当前场景去检索已建立的数据库,从而输出运动信息,这样就完成了机器人的学习。通常,机器学习方法采用离线形式,即预先用大量样本训练知识库,在线运行时直接使用。与之相对的在线学习,无需离线获得知识库,运行时从零起步逐步丰富,属于增量式学习。IHDR算法就具备这种增量式学习能力,从而让机器人实现在线自主学习。后来,我们一起制作了一个上位机来实现这一功能,如下图所示。

在线学习时,即使在采集图像和运动信息的同时进行训练,耗时也很短。不过IHDR的不足之处在于输入维数必须统一,而实际场景中可能没有足够的特征点可供提取。此外,当样本规模足够大时,IHDR的存储和检索会受到影响。后来师兄又将其应用于多人脸识别,实现了在线采集后立刻识别出对应人脸的功能,如下图所示。还取了一个较为复杂的名称:“a coarse real-time online tracking system on face detection and recognition from cluttered scenes”。

3 显著性检测和Photometric Stereo
3.1 显著性检测
对于图像处理中使用的各种方法,可以上升到更高层次的理论体系——显著性检测。这是一个受生物启发而提出的概念,又可细分为自下而上的目标驱动模型和自上而下的任务驱动模型。自上而下的模型针对训练样本中有代表性的特征,能检测某些固定大小及类别的目标。自下而上的方法基于底层视觉信息,能有效检测细节信息而非全局形状信息,且计算复杂度通常低于自上而下模型。说得更专业一些:生命体的视觉分为两个阶段,第一阶段完成基本特征提取,即自下而上的注意;第二阶段的选择由主观信息实现,即自上而下的注意(源于1980年Triesman等人提出的注意力特征综合理论)。归纳一下:自上而下的注意是一个认知过程,由人的心理状态和认知因素决定,如知识、当前或预期的目标;自下而上的注意是一个感知过程,通常基于底层视觉信息,单纯地从场景中提取出显著区域,一般具有强烈对比度或与周围有明显差异的区域能吸引注意力。
实际上,仔细思考便可看出,自上而下的研究基于机器学习或深度学习,需要大量样本作为支撑;自下而上的研究则基于图像本身的信息尤其是细节,即传统的图像处理方法。显著性检测对于计算机视觉中的预处理和降低计算复杂度具有重要意义,涉及丰富的图像处理基础与数学知识,许多专家在此领域耕耘。这里给出一个例子,展示同一检测方法在不同场景下的效果。

场景一

场景二
显然可以看出,在不同场景下,提取到的显著性目标完全不同。这正是由图像本身的差异、细节或“DNA”所决定的。
3.2 Photometric Stereo技术
前面介绍的图像处理方法均针对单一图像,所有可获取的信息都来自这个数字矩阵,因此无论进行多么复杂高级的变换,所能提取的信息仍然是有限的。然而还可以加入其他辅助信息,例如使用两个摄像头,并已知摄像头的距离与视角,类似人的双眼,同一时刻两个摄像头看到的图像信息不同,从而依据算法可实现双目测距;又如加入红外测距仪,可以测量场景中任意点到摄像头中心的距离(当然测距范围有限),这也是Kinect、Xtion、RealSense等传感器的基本原理。有了深度信息就能获得点云,捕获更丰富的信息。
Photometric Stereo技术是2015年在英国西英格兰大学访学时,于Centre for Machine Vision (CMV)实验室了解到的。从名称大致可以看出,通过照片或光度使获得的图像信息不仅限于平面,还能包含平面的法向量,从而建立三维模型,如下图所示。

同一静态物体从不同的光照角度拍摄

Face recognition and verification using photometric stereo

4 ROS+机器视觉
ROS是在加入HANS之后才真正开始使用的,关于ROS的具体使用这里不再赘述。在ROS中,通过cv_bridge包实现ROS图像与OpenCV图像之间的转换,再通过image_transport包订阅和发布图像数据。因此,ROS与OpenCV的结合主要在于解决环境配置问题,其次是图像转换问题,最后所发布的信息或接口可供其他ROS节点调用。
4.1 简单demo
当时在研究AGV时,主要涉及激光导航、磁带导航,有人提出是否可以增加视觉进行辅助定位,例如识别特定轨迹。于是做了一个简单的demo,具体流程:由于黑色像素较为明显,先对图像进行灰度处理转换为单通道,再使用Ostu阈值分割(大津法),得到二值化图像只有0和1,其中为0的部分为黑色,最终提取黑色部分并计算其长度。

此外,还可以进行二维码识别、定位等工作。尤其是二维码识别,当前OpenCV的版本已经支持识别和解析了。
4.2 再引入PCL
PCL(Point Cloud Library)点云库则更为深入,通常需结合深度相机如Kinect、RealSense等,其VSLAM、精准识别也在持续研究中。这里使用点云仅仅是为了探测地面的平整度。首先寻找一个标准的、平整的地面,运用RANSAC方法,根据投影到地面的点云计算出地面的平面方程(三维,且坐标系基于AGV车体中心),如下图所示。然后当AGV继续行驶时,实时刷新当前地面的平面方差。若前方出现凸起物或凹陷物,显然计算得到的平面方差会与之前标定的值存在偏差,且点云中会出现凸起或凹陷部分,需将其识别出来用于标识障碍物并加入局部路径规划。不过这个想法或实验并未真正做好或用好:未考虑地面本身存在坡度的情况;可能由于数据量过大,或深度相机本身存在测量误差,一些孤立点未能有效过滤导致计算偏差(研究点云库也需要长期积累)。

5 总结与展望
以上便是机器视觉的一些基本理论,以及在此领域的一些所见所闻所感。这是一个很好的研究方向,希望有更多人能够投入到实际产品的应用中,而不仅仅是让这些听起来高大上的算法停留在实验室论证阶段。在实际工业产品中,Halcon是应用最广泛的商业机器视觉库,由德国MVtec公司开发,是一套完善、标准的机器视觉算法包。其解决问题最多、最基本的是模板匹配。尽管网上关于OpenCV模板匹配的应用多如牛毛,但工业产品中仍以Halcon为主,原因是工业产品要求极为苛刻,即便是1%的误差也不允许,必须具有极强的鲁棒性。因此,图像处理固然有趣,OpenCV也很好用,但若能带着问题意识与产品思维去使用,就会发现还有许多待解决的问题摆在面前,激励我们不断努力探索与攻克。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:OpenCV与机器视觉基本理论解析要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点VSona是一个开发AI伴侣的平台,提供聊天、角色扮演、创意表达等功能。用户可自定义头像和声线,支持文字或语音互动。AI伴侣具备动画反馈和语音响应,营造安全、沉浸的个性化互动空间。
MastermallowAI音频母带处理适用于音乐、播客及内容创作者。可将原始录音一键转为专业音频,提升播客音质,为音乐作品添加母带效果。特色包括智能音频分析与增强、原音与母带实时对比、高质量成品下载。
MyCharacter AI是基于Polygon链的去中心化应用,通过CharacterGPTV2多模态AI系统生成具有独特形象和性格的AI角色。用户可与角色实时互动,并将其作为NFT收藏、交易或转让,实现AI角色生成、互动与资产化的一体化。
ToMate基于AI智能高效处理客户消息,适用于客服、销售及市场营销等场景。它能及时贴心回复,支持解析多种文件格式,并采用灵活定价方案,显著提升工作效率与客户满意度。
- 日榜
- 周榜
- 月榜
热点快看
