两个对于Apriltag图片处理问题讨论

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个对于Apriltag图片处理问题讨论相关的知识,希望对你有一定的参考价值。

简 介: ※Apriltag检测是对基于视觉定位的一种比较简便的方法。本文讨论了在apriltag检测结果中的单应矩阵的效果,它与想象中可以直接应用绘制出Apriltag法向量的应用并不符合。对于粘贴在非平面上的Apriltag算法能力进行了测试。如果粘贴在圆柱体上,在一定正对的角度范围内还是可以检测到Apriltag。

关键词 Apriltag

单应矩阵变换
文章目录
两个单应矩阵
从原点进行映射
Apriltag在圆柱上
处理结果
处理代码
识别结果
不同角度
识别结果
总 结

 

§01 应矩阵变换


  Apriltag检测结果中,包含了单应矩阵参数(Homography),它表征了对位于原点四个角落的点映射到检测到的Apriltag四个角点的单应矩阵。

▲ 图1.1 在Apriltag定位立方体两面的Apriltag

1.1 两个单应矩阵

apd = apriltag.Detector(apriltag.DetectorOptions(families='tag25h9'))

for id,imgfile in tqdm(enumerate(filedim)):
    img = cv2.imread(imgfile)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    tags = apd.detect(gray)

  在上述代码检测下,可以检测到两个tags,它们的单应矩阵为:

homo: [[ 6.68676859e-01  3.40896152e-02  2.82713831e+00]
 [-2.10627077e-01  7.71189655e-01  1.91688676e+00]
 [ 8.45537778e-05  7.78231041e-05  5.32189903e-03]]
homo: [[-5.21963542e-01 -3.95455759e-02 -1.49500546e+00]
 [-2.46071422e-01 -8.10661947e-01 -1.95403490e+00]
 [ 1.26923428e-04 -9.26461141e-05 -5.56235094e-03]]

  利用单应矩阵将四个角点进行逆映射,可以得到对应的校正后的角点的位置:

        corner = ones((4,3), float32)
        corner[:,:2] = tag.corners

        inv_c = linalg.inv(homo).dot(corner.T)
        print("inv_c.T:\\n".format(inv_c.T))
inv_c.T:
[[-193.81639822 -193.81639822  193.81639822]
 [ 187.66550781 -187.66550781  187.66550781]
 [ 182.3394766   182.3394766   182.3394766 ]
 [-188.14079484  188.14079484  188.14079485]]
inv_c.T:
[[ 178.67901064  178.67901064 -178.67901064]
 [-187.16842875  187.16842875 -187.16842874]
 [-180.89484096 -180.89484096 -180.89484096]
 [ 172.9529146  -172.9529146  -172.9529146 ]]

1.2 从原点进行映射

  如果设置位于(0,0)点,不同的z取值,使用Homography进行逆映射,是否可以获得原Apriltag中心点的位置呢。

        inv_c = linalg.inv(homo).dot(corner.T)
        print("inv_c.T:\\n".format(inv_c.T))

        for f in arange(0.1, 2, 0.05):
            c0 = array([0,0, mean(inv_c.T, axis=0)[-1]*f])
            c0_inv = homo.dot(c0)
            for c in tag.corners:
                cv2.circle(img, tuple(c.astype(int)), 4, (0,0,255),2)
            cv2.circle(img, tuple(tag.center.astype(int)), 8, (0, 100, 20), 4)
            cv2.circle(img, tuple(c0_inv[:2].astype(int)), 8, (0, 00, 255), 8)
            cv2.line(img, tuple(c0_inv[:2].astype(int)), tuple(tag.center.astype(int)), (200, 0,0), 3)

    break

    giffile = os.path.join(gifpath, '%03d.JPG'%id)
    cv2.imwrite(giffile, img)

▲ 图1.2.1 从(0,0)的不同高度进行单应转换获得轨迹

  上面的映射说明,原本希望能够获得一个从Apriltag中心垂直的法线向量,但实际上所得到的并不是。至少左边的Apriltag所对应的不是这样的映射。

  这其中遗留的问题令人匪夷。

 

§02 Apriltag在圆柱上


  果Apriltag不再平面上,而是在圆柱上,是否可以进行识别呢?

  下面进行测试。

▲ 图2.1 贴在圆柱上的Apriltag

2.1 处理结果

2.1.1 处理代码

from headm import *                 # =
import apriltag
import cv2

filename = '/home/aistudio/work/apcol.jpg'

img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

atd = apriltag.Detector(apriltag.DetectorOptions(families='tag36h11 tag25h9'))
tags = atd.detect(gray)

printt(tags:)

for tag in tags:
    for c in tag.corners:
        cv2.circle(img, tuple(c.astype(int)), 8, (255,0,0), 3)
    cv2.circle(img, tuple(tag.center.astype(int)), 8, (255,0,0),4)

plt.clf()
plt.figure(figsize=(10,10))
plt.axis("off")
plt.imshow(img)

2.1.2 识别结果

tags: [Detection(tag_family=b'tag25h9', tag_id=0, hamming=1, goodness=0.0, decision_margin=83.2973403930664, homography=array([[6.94448482e-01, 4.13404455e-02, 1.53937712e+00],
       [3.06866462e-02, 7.49597594e-01, 1.49692939e+00],
       [3.48276471e-06, 7.46954292e-05, 3.75277229e-03]]), center=array([410.19731493, 398.88628287]), corners=array([[218.68760681, 195.02702332],
       [595.53161621, 211.32849121],
       [593.89074707, 594.42523193],
       [231.76583862, 579.45843506]]))]

▲ 图2.1.1 Apriltag识别结果

2.2 不同角度识别结果

  旋转贴有Apriltag圆柱体一周,测试在什么角度可以识别到Apriltag,可以看到只有中间极少数的情况下,算法还可以检测到Apriltag。

▲ 图2.1.2 旋转 一周的Apriltag

▲ 图2.2.1 可以检测到Apriltag的情况

 

  结 ※


  Apriltag检测是对基于视觉定位的一种比较简便的方法。本文讨论了在apriltag检测结果中的单应矩阵的效果,它与想象中可以直接应用绘制出Apriltag法向量的应用并不符合。对于粘贴在非平面上的Apriltag算法能力进行了测试。如果粘贴在圆柱体上,在一定正对的角度范围内还是可以检测到Apriltag。


● 相关图表链接:

以上是关于两个对于Apriltag图片处理问题讨论的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的Apriltag,数字,动物水果分类器

基于Python下的Apriltag检测

APRILTAG 标准图片:TAG25H9

Apriltag可用图片:TAG16H5

旋转Apriltag角度检测

利用棋盘格重新校正摄像头,求取Apriltag取向