两个对于Apriltag图片处理问题讨论
简 介: ※Apriltag检测是对基于视觉定位的一种比较简便的方法。本文讨论了在apriltag检测结果中的单应矩阵的效果,它与想象中可以直接应用绘制出Apriltag法向量的应用并不符合。对于粘贴在非平面上的Apriltag算法能力进行了测试。如果粘贴在圆柱体上,在一定正对的角度范围内还是可以检测到Apriltag。
关键词
: Apriltag
Contents
识别结果
§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图片处理问题讨论相关推荐
- opencv resize_利用OpenCV 识别两张相似的图片
Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...
- opencv 取roi_利用OpenCV 识别两张相似的图片
Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...
- iOS 两种不同的图片无限轮播
代码地址如下: http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵 ...
- 【Photoshop技巧】两步将黑色图片改变颜色
[Photoshop技巧]两步将黑色图片改变颜色 很多时候因为特殊需要,要将一些素材变成其它颜色,试过很多方法,效果都不甚理想,尤其是像以下这种带有渐变色的素材. 以下是原素材图片: 工具/原料 Ph ...
- LaTeX中插入两个并排的图片
使用latex时,需要实现插入两个并排的图片,实现格式如下图: 使用LaTeX的代码 实现: \begin{figure}[htbp]\begin{minipage}[t]{0.5\linewidth ...
- php 比对两张图片,PHP实现图片相似度对比
PHP如何实现图片相似度对比?本文将通过感知哈希算法来实现搜索相似图片.希望对大家有所帮助. 感知哈希的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更.实际应用中,往往采用更强大的p ...
- 高清Apriltag图片生成和制作
近期需要用到Apriltag图像,作者源码给的图像像素太差,无法满足需要. 国内网站相关资料太少,有的作者还要收费,不理解.本来就是开源的东西.本文详细说明如何生成,并免费附上tag36h11 全系列 ...
- 简单的实现图片预览, 通过原生ajax以及 jQuery两种方法实现图片预览,有更好的办法可以留言喔...................
1.原生写ajax实现图片预览: 结构: <input type="file"> <img src="" alt="&q ...
- 关于css的text-indent首行缩进两个字符和图片缩进的问题
段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...
最新文章
- VS2003 下GridControl的列显示成图片+文字的形式实现
- R6034--ARCENGINE
- Eclipse 运行Openfire源码(Windows)
- Leetcode算法题(C语言)7--两个数组的交集 II
- Go 语言十年而立,Go2 蓄势待发
- iOS 后台运行实现总结
- 【2020CCPC秦皇岛:C】Cameraman(计算几何+思维+枚举)
- 建立自己的人脸数据集
- gtx1060 能用catia软件吗_性能炸天!资深IT大叔详测Precision 7730工作站
- 计算机硕士伊利诺伊大学排名,2020年伊利诺伊大学芝加哥分校排名TFE Times美国最佳计算机科学硕士专业排名第71...
- mysql中的count函数解释
- vue的watch监听的用法
- 海尔空调、新风系统加装wifi模块
- screen 使用命令
- redisclient工具个人理解
- 电机速度rpm转换成轮子的速度
- c语言 青蛙上台阶问题
- **旗舰店服务器迁移方案
- Python开发的Web在线学习教育培训网课系统
- #第一章 从数学拟合的角度看股市理论的预测环节--一、恼人的数学题
热门文章
- quartz异常:Couldn't rollback jdbc connection
- [20180602]函数与标量子查询3.txt
- find中的-print0和xargs中-0的奥妙
- 03_NoSQL数据库之Redis数据库:list类型
- Struts2获取request三种方法
- C# CAD对象 构造时应把它的父对象也加进它的属性里
- Netty:option和childOption参数设置说明
- SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
- SQL Server 重置SA密码语句
- flatbuffers 和netty的结合使用