以3*3的为例,
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
当然需要先在代码中设置
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即可得到此点在捕获的图像帧中对应的坐标,然后进行采样。