使用双目相机进行三维重建 第二部分:姿态估计

原标题 : 3D Reconstruction with Stereo Images - Part 2: Pose Estimation 作者 | Keenan James 翻译 | 酱番梨、Hasekiel_learn 校对 | 酱番梨 审核 | 酱番梨 整理 | 立鱼王 原文链接: https://medium.com/@dc.aihub/3d-reconstruction-with-stereo-images-part-2-pose-estimation-1bcfbba61b26 注:本文的相关链接请访问文末【阅读原文】 查看第一部分,请点击:使用双目相机进行三维重建 第一部分:相机校准

引言:在上一篇文章中我们讲了相机的特征以及这些信息与我们做3D重建有什么关系。通过相机校正,我们确认了一些我们程序要用的相机属性数据,即相机矩阵(camera matrix)和扭曲系数(distortion coefficients)。利用这些信息,我们可以从拍摄的模式图像(patterned image)中计算出现实空间中物体的位置。在我们的例子中,我们会用象棋棋盘图像,并通过3D立方的绘制方向来可视化平面物体的相对位置。

开始

这个练习的目的是给我们的图像画上x,y,z轴,放在棋盘的底部角落。按惯例,3D空间中X坐标轴用蓝色、Y用绿色、Z用红色。这个例子里,我们让Z轴垂直于物体(即Z轴是从棋盘2D平面指向相机的)。

我们首先取出之前练习保存的相机矩阵和扭曲系数。

import cv2import numpy as npimport glob
# Load previously saved datawith np.load('B.npz') as X:    mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]

接下来要写一个函数来绘制3D坐标轴。这个函数的输入是:棋盘图像、棋盘四个角(坐标)、三个分别代表三坐标轴方向终点的点(坐标)。

棋盘的角落可以用之前的`cv2.findChessboardCorner()`函数,返回的是一个含有4个角位置的数组。这里我们只需要注意底部左手角落,它是数组的第一个元素,如下图`corner[0]`。得到该坐标后,我们就可以利用之前定义的3个终点展开我们的坐标轴了。

def draw(img, corners, imgpts):    corner = tuple(corners[0].ravel())    img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5)    img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5)    img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5)    return img

下一步我们要在3D空间中定义一些点帮助我们绘制坐标轴。回忆一下在上一个练习中,我们令棋盘一个方块的边长等于一个单位。在这个例子中,我们在三个方向上画了长3个单位的坐标轴。Z轴需要标负值,因为这样可以保证轴线面朝相机。

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)objp = np.zeros((6*7,3), np.float32)objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)

现在我们可以用上我们的绘制函数了。第一步先读取图片,寻找7x6的格子(译者注:指棋盘)。找到之后,我们可以利用`cv2.solvePnPRansac()`计算其旋转角和平移距离(rotation and translation)。现在把3D空间的轴点(axis points)投影到2D图像平面去。识别出坐标轴后,就用绘制函数可视化其方向。

for fname in glob.glob('left*.jpg'):    img = cv2.imread(fname)    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
    if ret == True:        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        # Find the rotation and translation vectors.        rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
        # project 3D points to image plane        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
        img = draw(img,corners2,imgpts)        cv2.imshow('img',img)        k = cv2.waitKey(0) & 0xff        if k == 's':            cv2.imwrite(fname[:6]+'.png', img)
cv2.destroyAllWindows()

如下图,我们看到四张不同棋盘图像被我们程序处理后的结果。

渲染一个立方体

为了描画一个立方体,我们可以按照下文所述修改绘图函数。首先绘制一个3 x 3的正方形,朝向左下角并与我们的棋盘平行。然后我们将添加从该正方形延伸的线,以在面向相机的方向上完成立方体。

def draw(img, corners, imgpts):    imgpts = np.int32(imgpts).reshape(-1,2)
    # draw ground floor in green    img = cv2.drawContours(img, [imgpts[:4]],-1,(0,255,0),-3)
    # draw pillars in blue color    for i,j in zip(range(4),range(4,8)):        img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]),(255),3)
    # draw top layer in red color    img = cv2.drawContours(img, [imgpts[4:]],-1,(0,0,255),3)
    return img

我们必须修改轴点,并以此来囊括立方体的每个角。

axis = np.float32([[0,0,0], [0,3,0], [3,3,0], [3,0,0],                   [0,0,-3],[0,3,-3],[3,3,-3],[3,0,-3] ])

下面的两幅图片已将结果显示出来:

结论

在上述练习之后,我们可以考虑增强现实(AR)的应用。在这里,我们成功地将3D对象包含在真实世界图像中,该图像与所描绘的对象相互作用,允许真实世界和虚拟世界之间的动态链接。

作者:Keenan James,导师:Amit Maraj教授

想要继续查看该篇文章相关链接和参考文献?

本文分享自微信公众号 - AI研习社(okweiwu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

3D打印革命性升级!只要光照几十秒,完美雕像浮出水面丨Science

而利用光聚合反应,能够合成任意的几何形状,开头出现的神奇一幕,就是通过这个原理最终完成了3D打印。

8220
来自专栏量子位

只要算法够厉害,白墙能当镜子用:我初中物理都白学了 | Nature新论文

一篇新论文登上了Nature,论文中显示,仅仅用一台普通的数码相机,仅仅凭借墙上模糊不清的光影,就能还原最初的画面。

10220
来自专栏量子位

硬核佩奇和圣诞鳌拜,没有抠图AI能同时闯过这两关

随着AI技术的发展,抠图业也步入了新的竞争格局中,老牌巨头、新兴APP、开源项目、论文实现齐上阵,要把头发丝都抠出来。

13530
来自专栏量子位

一周AI十大要闻回顾 | 多项小技术有大突破,巨头忙打造产业基础平台

量子位筛选整理出过去一周Top 10,从技术新突破、政策新风向和产业新动态3大方面,为你提供最新趋势参考。

8540
来自专栏量子位

吴恩达获英特尔投资!这次,英特尔拿出7.85亿砸向AI创业公司

英特尔投资在其全球峰会上宣布,拿出1.17亿美元(约合人民币7.85亿)投资14家创业公司。

10540
来自专栏量子位

从高通加盟小鹏汽车负责自动驾驶后,吴新宙:L3方案下月亮相

3月13日,他们又有技术高管加盟。吴新宙,前高通自动驾驶业务负责人,正式官宣加盟小鹏汽车,出任自动驾驶副总裁,全面负责小鹏汽车自动驾驶美国及国内的整体技术路线规...

12210
来自专栏量子位

Deepfake又被玩坏了:马斯克一键变成钢铁侠,Gif表情包换脸App试一下

11310
来自专栏量子位

Adobe放出P图新研究:就算丢了半个头,也能逼真复原

不好不好,这可是限量版24k纯金足球纪念勋章挂坠的唯一存世照片,要是没了,就只能飞8个航班越过54座山丘穿越25000公里拿出我逆光也清晰的R213重新拍一张了...

7520
来自专栏量子位

华人女性AI科学家申省梅加盟安防新势力澎思,任职首席科学家,领导新加坡研究院

今日(3月19日),澎思科技宣布前松下新加坡研究院副院长申省梅为首席科学家,同时宣布成立澎思新加坡研究院,从事人工智能技术和深度学习领域的研究,申省梅担任院长,...

7810
来自专栏量子位

不用P30 Pro,普通手机也能变身望远镜:陈启峰团队新作,登上CVPR 2019

不过现在,就算不是P30 Pro,没有徕卡四摄,没有4,000万像素,只靠深度学习,iPhone也可以把50米之外的细节,拍得清楚明白。

12640

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励