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

关键词Apriltag

#mermaid-svg-SQT7eqKOvWmjFawa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .error-icon{fill:#552222;}#mermaid-svg-SQT7eqKOvWmjFawa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SQT7eqKOvWmjFawa .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-SQT7eqKOvWmjFawa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SQT7eqKOvWmjFawa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SQT7eqKOvWmjFawa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SQT7eqKOvWmjFawa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SQT7eqKOvWmjFawa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SQT7eqKOvWmjFawa .marker.cross{stroke:#333333;}#mermaid-svg-SQT7eqKOvWmjFawa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SQT7eqKOvWmjFawa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .cluster-label text{fill:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .cluster-label span{color:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .label text,#mermaid-svg-SQT7eqKOvWmjFawa span{fill:#333;color:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .node rect,#mermaid-svg-SQT7eqKOvWmjFawa .node circle,#mermaid-svg-SQT7eqKOvWmjFawa .node ellipse,#mermaid-svg-SQT7eqKOvWmjFawa .node polygon,#mermaid-svg-SQT7eqKOvWmjFawa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SQT7eqKOvWmjFawa .node .label{text-align:center;}#mermaid-svg-SQT7eqKOvWmjFawa .node.clickable{cursor:pointer;}#mermaid-svg-SQT7eqKOvWmjFawa .arrowheadPath{fill:#333333;}#mermaid-svg-SQT7eqKOvWmjFawa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SQT7eqKOvWmjFawa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SQT7eqKOvWmjFawa .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-SQT7eqKOvWmjFawa .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-SQT7eqKOvWmjFawa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SQT7eqKOvWmjFawa .cluster text{fill:#333;}#mermaid-svg-SQT7eqKOvWmjFawa .cluster span{color:#333;}#mermaid-svg-SQT7eqKOvWmjFawa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SQT7eqKOvWmjFawa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

单应矩阵变换
目 录
Contents
两个单应矩阵
从原点进行映射
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.cornersinv_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)breakgiffile = 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 cv2filename = '/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。


● 相关图表链接:

  • 图1.1 在Apriltag定位立方体两面的Apriltag
  • 图1.2.1 从(0,0)的不同高度进行单应转换获得轨迹
  • 图2.1 贴在圆柱上的Apriltag
  • 图2.1.1 Apriltag识别结果
  • 图2.1.2 旋转 一周的Apriltag
  • 图2.2.1 可以检测到Apriltag的情况

两个对于Apriltag图片处理问题讨论相关推荐

  1. opencv resize_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  2. opencv 取roi_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  3. iOS 两种不同的图片无限轮播

    代码地址如下: http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵 ...

  4. 【Photoshop技巧】两步将黑色图片改变颜色

    [Photoshop技巧]两步将黑色图片改变颜色 很多时候因为特殊需要,要将一些素材变成其它颜色,试过很多方法,效果都不甚理想,尤其是像以下这种带有渐变色的素材. 以下是原素材图片: 工具/原料 Ph ...

  5. LaTeX中插入两个并排的图片

    使用latex时,需要实现插入两个并排的图片,实现格式如下图: 使用LaTeX的代码 实现: \begin{figure}[htbp]\begin{minipage}[t]{0.5\linewidth ...

  6. php 比对两张图片,PHP实现图片相似度对比

    PHP如何实现图片相似度对比?本文将通过感知哈希算法来实现搜索相似图片.希望对大家有所帮助. 感知哈希的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更.实际应用中,往往采用更强大的p ...

  7. 高清Apriltag图片生成和制作

    近期需要用到Apriltag图像,作者源码给的图像像素太差,无法满足需要. 国内网站相关资料太少,有的作者还要收费,不理解.本来就是开源的东西.本文详细说明如何生成,并免费附上tag36h11 全系列 ...

  8. 简单的实现图片预览, 通过原生ajax以及 jQuery两种方法实现图片预览,有更好的办法可以留言喔...................

    1.原生写ajax实现图片预览: 结构:       <input type="file"> <img src="" alt="&q ...

  9. 关于css的text-indent首行缩进两个字符和图片缩进的问题

    段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...

最新文章

  1. VS2003 下GridControl的列显示成图片+文字的形式实现
  2. R6034--ARCENGINE
  3. Eclipse 运行Openfire源码(Windows)
  4. Leetcode算法题(C语言)7--两个数组的交集 II
  5. Go 语言十年而立,Go2 蓄势待发
  6. iOS 后台运行实现总结
  7. 【2020CCPC秦皇岛:C】Cameraman(计算几何+思维+枚举)
  8. 建立自己的人脸数据集
  9. gtx1060 能用catia软件吗_性能炸天!资深IT大叔详测Precision 7730工作站
  10. 计算机硕士伊利诺伊大学排名,2020年伊利诺伊大学芝加哥分校排名TFE Times美国最佳计算机科学硕士专业排名第71...
  11. mysql中的count函数解释
  12. vue的watch监听的用法
  13. 海尔空调、新风系统加装wifi模块
  14. screen 使用命令
  15. redisclient工具个人理解
  16. 电机速度rpm转换成轮子的速度
  17. c语言 青蛙上台阶问题
  18. **旗舰店服务器迁移方案
  19. Python开发的Web在线学习教育培训网课系统
  20. #第一章 从数学拟合的角度看股市理论的预测环节--一、恼人的数学题

热门文章

  1. quartz异常:Couldn't rollback jdbc connection
  2. [20180602]函数与标量子查询3.txt
  3. find中的-print0和xargs中-0的奥妙
  4. 03_NoSQL数据库之Redis数据库:list类型
  5. Struts2获取request三种方法
  6. C# CAD对象 构造时应把它的父对象也加进它的属性里
  7. Netty:option和childOption参数设置说明
  8. SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
  9. SQL Server 重置SA密码语句
  10. flatbuffers 和netty的结合使用