像素级编码标识点识别

    xiaoxiao2021-04-16  30

    编码标识点搜寻算法分两个大步骤,第一步是粗略定位编码标识点的大概位置,第二步是在定位的大概位置处读出编码标志点中心圆的圆心真实坐标,由数个子程序交替使用来实现。

    第一步工作:首先读入一张大图,进行二值化,大图上有噪点和数个编码标识点,此处去噪采用的是消去面积小于设定值 连通域的函数,将图中面积小于设定的一个“噪音大小”标准的连通域全部置零,去噪后会使得剩余噪音部分成为背景噪声(即面积远大于编码标识点区域面积的一个大连通域,直接去掉最大面积连通域即可消除)。

    而粗略查找编码标识点中的中心圆利用到两个数据,一个是所有连通域的面积,一个是所有连通域的周长,并由圆面积和周长公式可以分别求由面积与周长计算得出的中心圆半径,并进行误差判定,例如设定误差最大为0.9,面积大于120像素即可初步认为是疑似中心圆,由此可以在大图中定位出略多于真实圆数的圆,此时对原图进行分割,就会得到较多分割图,而这些分割图有很多都是相同的,只是截取坐标影响导致出现众多分割图。

    所以下一步需要根据这些图找真实的圆心坐标。此处我采用的是,对每一个分割图,在每个连通域里求得重心,并计算重心到边缘每个点的距离最后求标准差,标准差最小的就是最接近于圆的连通域(根据圆半径相等)。这样在每一个分割图中都可以找到一个最可靠的圆心,同时由于截取分割图的参数都是已知的,所以可以还原出这个真实圆心在大图中的位置,将所有分割图中圆心的位置都还原到大图上,并设定一个误差上限(例如设为2),就可以得到第二步所需要的、真实的编码标识点中心圆的位置信息,并得到我们所需要的分割图。第一步工作到此为止。

     

    第二步工作:根据第一步工作,我们可以直接求得真实圆心在分割图中的新位置,而其所在连通域即为中心圆,其他连通域即为周围的编码环(但是这个方法必然存在误差)。读取二进制编码,我采用的是以圆心所在位置向右水平将图像切开,并以此线为起点,根据arctan计算亮环区域所对应的圆心角,并求其间隔的圆心角,此后按二进制数排序出来成为一个数组(例如,0010010011就表示按起点开始数,两个36°的黑环,一个36°白环,两个36°的黑环,一个36°白环,两个36°的黑环,两个36°白环。但是使用此方案时,会遇到起点将亮环切开的情况,此时我采用的是补全法,即根据前后角度之和,判定此白环的圆心角,做完补全后再以此白环的起点为新的起点即可。)。最后根据二进制编码的规则(0起步1结尾,中间至少有一个0,所有组合最小的即为要表示的二进制数),对每个排出来的数组进行简单的左移变换并判定,找出最小的二进制数即可,最后进行二进制十进制转换,至此实现了二进制编码的识别,同时第二步到此结束。

     

    关于这个方案的总结:

    就目前的实验情况来说,可以应用于0.75米距离拍摄的编码标识点识别,识别所用图像尺寸为1440*1080,其中编码标识点中心圆半径约为12到14个像素。目前没有专门为倾斜拍摄下的鲁棒性做优化,但是由于使用了重心,所以根据实验情况,小倾斜角度也不影响结果(最核心的找圆没有问题那就不会有大问题)。同时,精确找圆的方案,事实上也是基于像素数量的,因为没有超大量实验,所以也不能断定这个方法误差小,但是这个方案相对(其他方案:例如用两条弦确定圆心、或是旋转图形随机找重合点之类)来说不需要很大量的运算,精确度像素级下也相对较高。

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-673035.html

    最新回复(0)