ARToolKit的Marker(barcode码)的ID识别

来源:互联网 发布:ots软件什么意思 编辑:程序博客网 时间:2024/05/17 06:27

以3*3的为例,


012345678

当然需要先在代码中设置

AR_MATRIX_CODE_TYPE matrixCodeType = AR_MATRIX_CODE_3x3_PARITY65;arSetMatrixCodeType(arHandle, matrixCodeType);
先说明一下,这种码的0,6,8号位用于确定marker的方向,正方向的情况下,0,6号设置为黑色,8号为白色,这个是不变的。1号位是奇偶校验位。剩下的是数据位,依次为2,3,4,5,7,以这个顺序排序组成的二进制码对应的数字为ID。


在arGetMarkerInfo()函数中,对候选的marker2_num个marker标记进行遍历。对于每次遍历,arGetLine()函数通过将四边形的四条边进行线性拟合,提取到四条直线的交点,确定候选marker的区域。然后进入arPattGetIDGlobal()函数。

arPattGetIDGlobal()函数中主要有两个函数:①arPattGetImage2()  ②get_matrix_code()

①上边说的marker内部一共有3*3个小方格,每个小方格代表一位二进制位,在每个小方格中,程序进行了9个不同位置的采样(具体这个9是怎么来的还没咋看懂),取9个采样的灰度值的平均值,最后会得到9个方格对应的9个灰度值,储存在ext_patt[9]中。

②为先确定marker的方向,所以先取四个角上的0,2,6,8号位的灰度值,找出4个中的最大值和最小值,两个值的差如果小于某个阈值(30),则认为不是marker;如果大于阈值,接下来再设置一个阈值thresh=(max-min)/2;以thresh这个阈值将9个灰度值二值化为0或1,最后提取出数据位的码进行解码得到ID。



arPattGetIDGlobal()函数中的第一个函数 arPattGetImage2()中采样点是怎样确定的呢?

① get_cpara( world, local, para );world是手动设置的一个正方形的四个顶点坐标,local是检测到的标记物的四个点的坐标。利用此函数求得标记物的仿射变换矩阵para。

②例如标记物编码区是3 * 3个方格,每个方格采样九个,将这81个采样点在标准正方形中确定坐标,乘上para即可得到此点在捕获的图像帧中对应的坐标,然后进行采样。



原创粉丝点击