二维码扫码已经是人们日常生活的一部分,二维码识别已经是事实证明的成熟有效的技术。可以说,二维码是联系现实世界(物理空间)与虚拟世界(像素空间)的很好的媒介。在机器视觉定位桌面物体任务时,可以利用二维码技术结合透视变换,实现像素坐标与物理世界平面的关系映射,快速实现像素坐标转桌面坐标。

站在巨人肩膀上可以看得更远,我们可以利用apriltag二维码系统,通过其python 库和API进行定位识别,而透视变换可以利用opencv库warpPerspective函数进行坐标转换。简单的步骤如下:

1.制作apriltag二维码标签及平面板

去打印店打印以下二维码贴纸。

将二维码贴到需要定位的平面板上,设置好对应的尺寸关系(如以下棋盘):

如图所示,将二维码以一定的顺序,以一定的定位规则,贴在待识别的平面板上,目的是确定明确的物理关系,通过四个二维码作为桥梁,建立像素坐标和现实坐标(可以自定义)的关系。上例中,棋盘的格子实际距离是20mm,可以定义其现实坐标系的原点在红帅的正下方(如图),四个二维码根据顺时针依次贴在棋盘四个固定点上面,建立一个矩形,至此,已经定义好了在现实坐标系中,四个二维码的坐标([x0,y0],[x1,y1],[x2,y2],[x3,y3])

定义好现实坐标系,和像素坐标系,以及定位好四个二维码位置之后,就可以利用二维码识别和图像变换算法进行坐标转换了。

2.利用二维码识别API和opencv透视变换算法进行图像变换

相机放在棋盘的正上方,对角度可以不用太严格,然后利用二维码识别和opencv相关算法,首先对图像中的二维码的位置(像素位置)进行识别,获得四个点([u0,v0],[u1,v1],[u2,v2],[u3,v3])像素坐标,然后可以利用cv2.getPerspectiveTransform函数,根据已知四个二维码的现实坐标([x0,y0],[x1,y1],[x2,y2],[x3,y3]),像素像素坐标([u0,v0],[u1,v1],[u2,v2],[u3,v3]),获取透视变换矩阵M,再利用cv2.warpPerspective函数对原始图像进行透视变换,最后利用类似本专栏“机器视觉实用工具集NO.1——根据任意矩形(四点坐标)截取指定区域图像”CSDN,将感兴趣的区域绘制出来:

以上经过变换后的图像,其实就成了平面的标准俯视图,像素坐标与世界坐标只有平移关系,高中知识就可以进行转换,这样,就完成了相机的标定。

最后,上代码:

def apritap(img,multple=1):"""识别apritap,编码1,2,3,4,以list返回返回格式tag_family = b'tag36h11'tag_id = 0hamming = 0decision_margin = 77.8178939819336homography = [[ 9.38594313e+01 -3.50009146e+01  1.77953267e+02][-1.84246098e+01  4.19208395e+01  1.48880013e+03][-1.88073574e-02 -4.21612869e-02  1.00000000e+00]]center = [ 177.95326699 1488.80012794]corners = [[  50.26684952 1586.18933105][ 252.18730164 1610.48547363][ 299.81182861 1395.85595703][ 112.2509613  1381.10009766]]pose_R = Nonepose_t = Nonepose_err = None, Detection object:"""if len(img.shape)==2:            detector = apriltag.Detector()tags= detector.detect(img)            #print("%d apriltags have been detected."%len(tags))if multple:return True,tagselse:                if len(tags)==1:return True,tags[0].centerelse:return False,Noneelif len(img.shape)==3 and img.shape[2]==3:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)detector = apriltag.Detector()tags= detector.detect(img) if multple:return True,tagselse:    if len(tags)==1:return True,tags[0].centerelse:return False,Nonedef armz2topz(parm,urw,bzero):"""在变换后正俯视图中,现实坐标转化成正俯视像素坐标(高中坐标平移知识)"""btx=bzero[0]bty=bzero[1]            px=parm[0]py=parm[1]topx=-1*py+btxtopy=bty-pxreturn [topx*urw,topy*urw]      def uv2chessmap(img,box,module=None,isjust=0,bais=[0,0],cbox=20,size=[9,8],wbox={0:(180,-90),1:(180,90),2:(180+7*20,90),3:(180+7*20,-90)},urw=3,bzero=[100+100,40+180+160], **args):"""根据二维码/box四点顺时针,依次,0右下,1左下,2左上,3右上wbox四个点定义的现实坐标为0:(170,-90),1:(170,90),2:(330,90),3:(330,-90)^x|y<----|变换成矩形box:二维码中心像素坐标wbox:二维码现实坐标cbox:棋盘格长度20mmurw:单位mm所对应的像素比例 size:棋盘格长9格,宽8格bzero:现实坐标系原点在透视变换后,正俯视图世界坐标的坐标:------->x|||_ y"""# 根据wbox和单位mm像素,计算变换后的图像坐标四个点,定义1,2点u为0点,if module:bais=module['@bais']isjust=module['@isjust']pbox=[]if len(wbox)==4:#机械臂坐标转俯视坐标       for k in range(4):parm=wbox[k]pbox.append(armz2topz(parm,urw,bzero))#棋盘原点坐标zerox=pbox[1][0]+10*urw+bais[0]#增加修正if zerox<0:zerox=0            zeroy=pbox[2][1]-cbox*urw+bais[1]#增加修正if zeroy<0:zeroy=0            pts1 = np.array(box, np.float32) pts2=  np.array(pbox, np.float32) M=cv2.getPerspectiveTransform(pts1,pts2)  #裁剪图像大小:wise=(wbox[1][1]-wbox[0][1]+8*cbox)*urwhigh=(wbox[2][0]-wbox[0][0]+5*cbox)*urw    Timg = cv2.warpPerspective(img, M, (wise,high)) if isjust==0:#绘制棋盘格各顶点for xi in range(9):for yi in range(10):cv2.circle(Timg, (round(zerox+xi*cbox*urw),round(zeroy+yi*cbox*urw)),4,(255,0,0), 2) # center return Timg

机器视觉实用工具集NO.6——图像变换应用,利用apriltag二维码+透视变换实现水平面相机像素/世界坐标转换相关推荐

  1. iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片

    二维码扫描在App中很常见的功能,之前都是用三方工具Zing.ZBar.后来Apple的AVFoundation也支持二维码扫描.生成,而且效率比三方库还要高.我把它封装成一个工具,这样使用起来十分方 ...

  2. 用Hutool工具类生成一个带LOGO图标的二维码

    本文主要介绍的是,如何通过在线url LOGO图标生成一个自定义内容的二维码. 目录 一.导入依赖 二.生成二维码 三.QrConfig类属性描述 一.导入依赖 本文使用了Hutool工具包中的二维码 ...

  3. 机器视觉实用工具集NO.4——颜色查找可视化工具,在HSV、LAB、RGB三个颜色空间轻松进行颜色查找

    查找颜色是机器视觉任务中非常重要的的一个功能,其难点不是算法,而是在不同的灯光等环境条件下,选择合适的参数,参数的调整依赖于人的经验,而用一个合适的工具可以帮助对各颜色空间分布不了解的初学者快速实现目 ...

  4. 机器视觉实用工具集NO.16——指定监控区域运动物体闯入检测工具

    目录 前言 原理 Python实现源码 前言 在安防领域,很常见的一个机器视觉检测任务是区域闯入报警侦测,实现此功能,并不是非常困难,可以利用光流法对视频固定区域内的图像(相邻帧的)特征点变化情况进行 ...

  5. 机器视觉实用工具集NO.10——使用深度学习模型(yolo3)实现物体检测工具

    目录 前言 opencv+YOLO3实现物体检测 python源码 前言 OpenCV 3.3版本之后提供了对主流深度学习主干网络框架的加载支持.opencv给我们提供了一个应用成熟深度学习模型的便捷 ...

  6. 机器视觉实用工具集NO.13——利用直方图平衡及色阶构建图像去雾、增亮等预处理操作工具

    前言 有时候,拍摄的图片会由于环境光.相机曝光度等原因造成图像有层类似雾的灰度或者是颜色失真等现象,图像直方图表现为在某个阈值区间有较多像素聚集,可以通过opencv的equalizeHist函数对图 ...

  7. 小程序入口构造工具二维码测试工具

    作者 | 吴鹏和 本文将介绍我们小程序中隐藏的两个工具页面.原理虽不复杂,收益却实实在在,或许也能给诸君带来启发. 入口构造工具 痛点 PM&运营 投放链接 PM&运营每次投放新入口时 ...

  8. com.google.zxing 二维码工具类

    com.google.zxing 二维码工具类 pom 工具类 使用 pom <dependency><groupId>com.google.zxing</groupId ...

  9. Java二维码工具类(超详细注释)

    二维码工具类 准备工作: pom.xml 引入依赖 <!-- 二维码 --> <dependency><groupId>com.google.zxing</g ...

最新文章

  1. 安卓性能测试之 adb shell 常用命令
  2. SAFESEH 映像的模块不安全
  3. 国际人工智能算法与应用研讨会(WASA 2018)参会笔记
  4. 安庆机器人编程选_安庆市首届中小学机器人创客竞赛举行 460名选手比智慧拼创新 科技感满满!...
  5. vue项目微信分享之后路由链接被破坏怎么办
  6. JTable表格内容导出execl表
  7. 20191201每日一句
  8. centos安装pip失败:No package pip available.
  9. Unity3D中关于Mesh.MarkDynamic
  10. 电脑重装教程win10系统怎样重装
  11. MangoDB索引、排序和聚合
  12. 用excel做线性规划
  13. BP神经网络(BPNN)
  14. 虚拟偶像成为二次元香饽饽,从直播切入有戏吗?
  15. 学前端需要什么学历?
  16. salesforce工作中常用的formula用法汇总
  17. 交换机之恢复重置设备密码
  18. 全局序列比对 c语言实现,序列比对(一)——全局比对Needleman-Wunsch算法
  19. 我们来了!多云架构时代,欢迎加入中国开源网络新势力
  20. 关于结构化、半结构化、非结构化数据的理解

热门文章

  1. 自然语言处理实战-基于LSTM的藏头诗和古诗自动生成
  2. 超分论文笔记2020CVPR视频超分:Zooming Slow-Mo- VSR with Temporal Group Attention-TDAN
  3. 【工具分享 】分享一个jQuery多版本XSS漏洞检测工具
  4. CSS3 文字去毛边
  5. 微软不再为 DNS over HTTPS (DoH) 提供 Google PublicDNS 和 Cloudflare DNS 服务提供商
  6. for循环执行流程面试题(经典)
  7. 5G(NR)频率资源划分
  8. oracle10g ora 01841,数据恢复:Oracle数据库中实例恢复起点与终点及RBA
  9. 软件著作权一次下证快速下载教程
  10. Oracle JDE 重复制造MRP概览