两个对于Apriltag图片处理问题讨论
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个对于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图片处理问题讨论的主要内容,如果未能解决你的问题,请参考以下文章