姿势估计

目标
  • 本节我们要学习使用 calib3D 模块在图像中创建 3D 效果

基础
  在上一节的摄像机标定中,我们已经得到了摄像机矩阵,畸变系数等。有了这些信息我们就可以估计图像中图案的姿势,比如目标对象是如何摆放,如何旋转等。对一个平面对象来说,我们可以假设 Z=0,这样问题就转化成摄像机在空间中是如何摆放(然后拍摄)的。所以,如果我们知道对象在空间中的姿势,我们就可以在图像中绘制一些 2D 的线条来产生 3D 的效果。我们来看一下怎么做吧。
  我们的问题是,在棋盘的第一个角点绘制 3D 坐标轴(X,Y,Z 轴)。X轴为蓝色,Y 轴为绿色,Z 轴为红色。在视觉效果上来看,Z 轴应该是垂直与棋盘平面的。
  首先我们要加载前面结果中摄像机矩阵和畸变系数。

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 28 11:06:10 2014
@author: duan
"""
import cv2
import numpy as np
import glob
# Load previously saved data
with np.load('B.npz') as X:
mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]

现在我们来创建一个函数:draw,它的参数有棋盘上的角点(使用cv2.findChessboardCorners() 得到)和要绘制的 3D 坐标轴上的点。

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 角点)和坐标轴点。3D 空间中的坐标轴点是为了绘制坐标轴。我们绘制的坐标轴的长度为3。所以 X 轴从(0,0,0)绘制到(3,0,0),Y 轴也是。Z 轴从(0,0,0)绘制到(0,0,-3)。负值表示它是朝着(垂直于)摄像机方向。

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() 来计算旋转和变换。但我们有了变换矩阵之后,我们就可以利用它们将这些坐标轴点映射到图像平面中去。简单来说,我们在图像平面上找到了与 3D 空间中的点(3,0,0),(0,3,0),(0,0,3) 相对应的点。然后我们就可以使用我们的函数 draw() 从图像上的第一个角点开始绘制连接这些点的直线了。搞定!!!

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 28 11:07:34 2014
@author: duan
"""
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 个格子的长度。

渲染一个立方体
  如果你想绘制一个立方体的话要对 draw() 函数进行如下修改:修改后的 draw() 函数:

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

修改后的坐标轴点。它们是 3D 空间中的一个立方体的 8 个角点:

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] ])

结果如下:

  如果你对计算机图形学感兴趣的话,为了增加图像的真实性,你可以使用OpenGL 来渲染更复杂的图形。(下一个目标)

要学习使用 calib3D 模块在图像中创建 3D 效果-姿势估计相关推荐

  1. 活动报名丨英伟达AI Lab科学家、GET3D一作高俊:从图像中学习3D对象的生成建模...

    12月12日(周一)上午9:00「青源Live第57期丨英伟达AI Lab科学家.GET3D一作高俊:从图像中学习3D对象的生成建模」将在线举办,多伦多大学博士生.英伟达AI Lab研究科学家高俊做报 ...

  2. 视频中的3D人体姿态估计(3D human pose estimation in vide)--------Facebook research: VideoPose3D

    视频中的3D人体姿态估计(3D human pose estimation in video) 解读Facebook AI Research in CVPR2019: <3D human pos ...

  3. tableau实战系列(三十四)-教你如何在tableau中实现3D效果作图

    前言 我们知道,目前 Tableau 还不支持 3D 图表的实现.但是,如果你希望在 Tableau 中呈现立体效果,我们可以另辟蹊径,来实现一些简单的. 柱形图很常见,因为是平面的,也被称为条形图. ...

  4. 从零开始前端学习[36]:Cs3中的3D效果实现

    Cs3中的3D效果实现 perspective井深 transform-style 3D环境 提示 博主:章飞_906285288 博客地址:http://blog.csdn.net/qq_29924 ...

  5. AI中的3D效果应用——凸出与斜角

    AI中的3D效果应用--凸出与斜角 (写作时间:6月5日 作者:陈铭军) 如何使用AI中的3D效果中的凸出与斜角做一个骰子,首先使用椭圆工具(L)画出骰子的1-6的样子,就像这样. 然后在菜单栏中点击 ...

  6. Im2Mesh GAN:从一张RGB图像中恢复3D手部网格

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白导读 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家 ...

  7. 谷歌最新论文:从图像中进行3-D目标检测

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:黄浴 知乎链接:https://zhuanlan.zhihu.com/p/1 ...

  8. three.js创建光线_使用Three.js在图像上创建波动效果

    three.js创建光线 View demo 查看演示Download Source 下载源 Waves! Because who does not enjoy the visual comfort ...

  9. 三维场景中创建镜面反射效果(three.js实战9)

    创建镜面效果 1. demo效果 2. 实现要点 2.1 创建三维模型 2.2 创建镜面 2.3 场景动画更新 3. demo代码 1. demo效果 2. 实现要点 2.1 创建三维模型 demo中 ...

  10. 在Unity中创建3D直升机游戏

    In this lecture from Colton Ogden, you can learn game development principles by coding a Helicopter ...

最新文章

  1. Java中如何锁文件
  2. 上古神器之Vim编辑器
  3. [html] 如何使用纯HTML实现跑马灯的效果?
  4. java子类继承父类实际_java子类继承父类,是否生成父类对象?
  5. wordpressQQ登陆php代码,仅在登录时使用wordpress PHP代码
  6. springcloud 服务网关Zuul实战(一)基本路由配置
  7. Global.asax中的C#服务
  8. String源码解析
  9. 20165226 实验四 Android程序设计
  10. 利用D3D抓取GPU数据
  11. Qt 70行代码实现控件任意拆分 选中控件水平垂直拆分 窗口分割
  12. 使用 Chrome 浏览器截取网页长图
  13. 2020-08-17 java实战项目汇总
  14. atomd525服务器性能,Atom D525性能几何?
  15. HDOJ 1025 DP
  16. php网站后台不显示验证码,网站后台验证码不显示原因
  17. matlab星三角变压器,什么是变压器星三角接法
  18. 【设计模式-行为型-中介者模式(Mediator)】
  19. Oracle-第4章 单行函数
  20. Docker各操作系统安装方式及优缺点

热门文章

  1. 分类与聚类的区别以及聚类的方法分类
  2. 二值图像分析—轮廓发现
  3. sin级数展开c语言,三角函数sin的泰勒级数展开
  4. 全市场等权中位数_市场指数估值周报20200406
  5. python画指北针_Python-geopandas 中国地图绘制
  6. python 时间序列异常值_干货 :时间序列异常检测
  7. Android实现淘宝体验的商品列表排序分类点击事件
  8. 模式识别谱聚类matlab,基因表达谱聚类分析
  9. Java集合(一)什么是集合
  10. 8/3 MATLAB绘制正态分布概率密度函数(normpdf)图形