前言
第一篇我们在电脑上搭建了opencv环境以方便我们处理图像,并且成功对图像进行了二值化和压缩操作,接下来我们的目标很简单,就是找到图像的边界、并通过边界找到赛道中线。这一篇完成后,你应该可以实现巡线操作。
一、寻找图像的边界
目前我接触过两种图像边界的寻找方法,一个是八邻域,另一个是最长白列,两种算法各有优劣。
1、八邻域
我们先来讲八邻域,八邻域算法相比于最长白列的优点就是节省算力,因为它不需要大面积地遍历图像。
这里以左边界为例,讲解一下八邻域算法是怎么运作的。
如图是左边界的一部分,仔细观察,白道到边界都会有一个很明显的跳变。那么在寻找边界时,我们着重寻找白到黑的跳变点即可。
接下来,我们从边界上选择一个像素点C,并标出了与这个像素点相邻的8个像素点。
我们所要做的就是遍历相邻的这8个像素点,并找出由白到黑的跳变点(当前相邻点为255,且下个相邻点为0)就能找到左边界的其中一个像素点。
以这张图为例,我们确定了起始像素点C,然后开始在C的相邻点中找到跳变点。我们可以看到,第0个相邻点是白(255),第1个像素点是黑(0),正好满足从白到黑要求,那么我们认为,第0个相邻点是边界的一部分。
注意:第4个相邻点到第5个相邻点是从黑到白,并不符合我之前定义的从白到黑的跳变点,所以将会舍去。
接下来该怎么办?
我们已经搜索到了第0个像素点是边界的一部分,接下来,我们就可以选择第0个像素点为起始像素点C,然后重复执行上述操作,即可找出完整的左边界。