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

举报
tsinghuazhuoqing 发表于 2022/01/03 23:45:06 2022/01/03
【摘要】 简 介: ※Apriltag检测是对基于视觉定位的一种比较简便的方法。本文讨论了在apriltag检测结果中的单应矩阵的效果,它与想象中可以直接应用绘制出Apriltag法向量的应用并不符合。对于粘...

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

关键词 Apriltag

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

 

§01 应矩阵变换


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

▲ 图1.1 在Apriltag定位立方体两面的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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  在上述代码检测下,可以检测到两个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]]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

        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))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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

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

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

 

§02 Apriltag在圆柱上


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

  下面进行测试。
▲ 图2.1 贴在圆柱上的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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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]]))]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

▲ 图2.1.1 Apriltag识别结果

▲ 图2.1.1 Apriltag识别结果

2.2 不同角度识别结果

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

▲ 图2.1.2  旋转 一周的Apriltag

▲ 图2.1.2 旋转 一周的Apriltag

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

 

  结 ※


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


● 相关图表链接:

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/122275895

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。