先了解如何利用python语言实现以平面和标记物进行姿态估计

本实验只是先实现一个简单的小例子。简单来说就是先识别出图像中的参考面,再拍摄一张目标图像,将参考面顶部的3D模型投影到目标图像上。

大致步骤如下:

识别参考平面

在这一步中,我们所需要做的事就是提取参考图像和目标图像的sift特征,然后使用RANSAC算法稳健地估计单应性矩阵。

代码如下:

#计算特征

sift.process_image('D:输入图片/book_frontal.JPG', 'im0.sift')

l0, d0 = sift.read_features_from_file('im0.sift')

sift.process_image('D:输入图片/book_per.JPG', 'im1.sift')

l1, d1 = sift.read_features_from_file('im1.sift')

#匹配特征,并计算单应性矩阵

matches = sift.match_twosided(d0, d1)

ndx = matches.nonzero()[0]

fp = homography.make_homog(l0[ndx, :2].T)

ndx2 = [int(matches[i]) for i in ndx]

tp = homography.make_homog(l1[ndx2, :2].T)

model = homography.RansacModel()

H, inliers = homography.H_from_ransac(fp, tp, model)

由上面代码可得到单应性矩阵,它能够将一幅图像中标记物的点映射到另一幅图像中的对应点。还需要建立X-Y(Z=0)三维坐标系,标记物在Z=0平面上,原点在标记物的某个位置上。

从单应性推导出从参考面坐标系到目标图像坐标系的转换

在进行坐标转换之前,为了检验单应性矩阵结果的正确性,需要将一些三维物体放置在目标图像上,本实验使用了一个立方体。产生立方体的代码如下:

def cube_points(c, wid):

p = []

p.append([c[0]-wid, c[1]-wid, c[2]-wid])

p.append([c[0]-wid, c[1]+wid, c[2]-wid])

p.append([c[0]+wid, c[1]+wid, c[2]-wid])

p.append([c[0]+wid, c[1]-wid, c[2]-wid])

p.append([c[0]-wid, c[1]-wid, c[2]-wid])

p.append([c[0]-wid, c[1]-wid, c[2]+wid])

p.append([c[0]-wid, c[1]+wid, c[2]+wid])

p.append([c[0]+wid, c[1]+wid, c[2]+wid])

p.append([c[0]+wid, c[1]-wid, c[2]+wid])

p.append([c[0]-wid, c[1]-wid, c[2]+wid])

p.append([c[0]-wid, c[1]-wid, c[2]+wid])

p.append([c[0]-wid, c[1]+wid, c[2]+wid])

p.append([c[0]-wid, c[1]+wid, c[2]-wid])

p.append([c[0]+wid, c[1]+wid, c[2]-wid])

p.append([c[0]+wid, c[1]+wid, c[2]+wid])

p.append([c[0]+wid, c[1]-wid, c[2]+wid])

p.append([c[0]+wid, c[1]-wid, c[2]-wid]

return array(p).T

先计算出照相机的标定矩阵,就可以得出两个视图间的相对变换

代码如下:

#计算照相机标定矩阵,使用图像的分辨率为747*1000

K = my_calibration((747, 1000))

#位于边长为0.2,Z=0平面上的三维点

box = cube_points([0, 0, 0.1], 0.1)

#投影第一幅图像上底部的正方形

cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]])))))

#底部正方形上的点

box_cam1 = cam1.project(homography.make_homog(box[:, :5]))

#使用H将点变换到第二幅图像上

box_trans = homography.normalize(dot(H,box_cam1))

#从cam1和H中计算第二个照相机矩阵

cam2 = camera.Camera(dot(H, cam1.P))

A = dot(linalg.inv(K), cam2.P[:, :3])

A = array([A[:, 0], A[:, 1], cross(A[:, 0], A[:, 1])]).T

cam2.P[:, :3] = dot(K, A)

#使用第二个照相机矩阵投影

box_cam2 = cam2.project(homography.make_homog(box))

在图像(像素空间)中投影我们的3D模型并绘制它。

#底部正方形的二维投影

figure()

imshow(im0)

plot(box_cam1[0, :], box_cam1[1, :], linewidth=3)

title('2D projection of bottom square')

axis('off')

#使用H对二维投影进行变换

figure()

imshow(im1)

plot(box_trans[0, :], box_trans[1, :], linewidth=3)

title('2D projection transfered with H')

axis('off')

#三维立方体

figure()

imshow(im1)

plot(box_cam2[0, :], box_cam2[1, :], linewidth=3)

title('3D points projected in second image')

axis('off')

实验结果如下

什么是AR

AR全称Augmented Reality,意为增强现实技术。

它是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。

增强现实技术,不仅展现了真实世界的信息,而且将虚拟的信息同时显示出来,两种信息相互补充、叠加。在视觉化的增强现实中,用户利用头盔显示器,把真实世界与电脑图形多重合成在一起,便可以看到真实的世界围绕着它。

增强现实技术包含了多媒体、三维建模、实时视频显示及控制、多传感器融合、实时跟踪及注册、场景融合等新技术与新手段。增强现实提供了在一般情况下,不同于人类可以感知的信息。

如何利用python实现AR

步骤和实现姿态估计无太大差别。由上述内容计算出照相机的位置和姿态,使用这些信息来放置计算机图像学模型。这里我们放置了一个红色的小茶壶。

核心代码如下:

def set_projection_from_camera(K):

#从照相机标定矩阵中获得视图

glMatrixMode(GL_PROJECTION)

glLoadIdentity()

fx = K[0,0]

fy = K[1,1]

fovy = 2*math.atan(0.5*height/fy)*180/math.pi

aspect = (width*fy)/(height*fx)

near = 0.1

far = 100.0

gluPerspective(fovy,aspect,near,far)

glViewport(0,0,width,height)

def set_modelview_from_camera(Rt):

#从照相机姿态中获取模拟视图矩阵

glMatrixMode(GL_MODELVIEW)

glLoadIdentity()

Rx = np.array([[1,0,0],[0,0,-1],[0,1,0]])

R = Rt[:,:3]

U,S,V = np.linalg.svd(R)

R = np.dot(U,V)

R[0,:] = -R[0,:]

t = Rt[:,3]

M = np.eye(4)

M[:3,:3] = np.dot(R,Rx)

M[:3,3] = t

M = M.T

m = M.flatten()

glLoadMatrixf(m)

def draw_background(imname):

#使用四边形绘制背景图像

bg_image = pygame.image.load(imname).convert()

bg_data = pygame.image.tostring(bg_image,"RGBX",1)

glMatrixMode(GL_MODELVIEW)

glLoadIdentity()

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

glEnable(GL_TEXTURE_2D)

glBindTexture(GL_TEXTURE_2D,glGenTextures(1))

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,bg_data)

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)

glBegin(GL_QUADS)

glTexCoord2f(0.0,0.0); glVertex3f(-1.0,-1.0,-1.0)

glTexCoord2f(1.0,0.0); glVertex3f( 1.0,-1.0,-1.0)

glTexCoord2f(1.0,1.0); glVertex3f( 1.0, 1.0,-1.0)

glTexCoord2f(0.0,1.0); glVertex3f(-1.0, 1.0,-1.0)

glEnd()

glDeleteTextures(1)

def draw_teapot(size):

#在原点处绘制红色茶壶

glEnable(GL_LIGHTING)

glEnable(GL_LIGHT0)

glEnable(GL_DEPTH_TEST)

glClear(GL_DEPTH_BUFFER_BIT)

glMaterialfv(GL_FRONT,GL_AMBIENT,[0,0,0,0])

glMaterialfv(GL_FRONT,GL_DIFFUSE,[0.5,0.0,0.0,0.0])

glMaterialfv(GL_FRONT,GL_SPECULAR,[0.7,0.6,0.6,0.0])

glMaterialf(GL_FRONT,GL_SHININESS,0.25*128.0)

glutSolidTeapot(size)

width,height = 1000,747

def setup():

pygame.init()

pygame.display.set_mode((width,height),OPENGL | DOUBLEBUF)

pygame.display.set_caption("OpenGL AR demo")

实验结果如图:

运行代码遇到的错误及解决方案

错误如下:An error ocurred while starting the kernelfreeglut ERROR: Function called without first calling ‘glutInit'.

原因:经大神指点得知这个错误是freeglut和glut共存的缘故,它们俩定义了相同的方法,这个是动态链接库的重叠问题,我的在ana\Lib\site-packages\OpenGL\DLLS文件夹里面。

你需要删除freeglut.vc15.dll这个文件。我这是已经删除完的样子。

以上这篇利用python实现AR教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

如何利用python在yi_[宜配屋]听图阁相关推荐

  1. python 托盘_[宜配屋]听图阁

    本文实例为大家分享了python实现桌面托盘气泡提示的具体代码,供大家参考,具体内容如下 # -*- encoding:utf-8 -*- ############################## ...

  2. 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...

    本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第 ...

  3. python京东自动签到领金豆_[宜配屋]听图阁 - 利用python Selenium实现自动登陆京东签到领金币功能...

    如何自动登陆京东? 我们先来看一下京东的登陆页面,如下图所示: [插入图片,登陆页面] 登陆框就是右面这一个框框了,但是目前我们遇到一个困呐,默认的登陆方式是扫码登陆,如果我们想要以用户民个.密码的形 ...

  4. 怎么用python打印照片_[宜配屋]听图阁

    这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 前言 第一次在学校机房里见到计算机,还是上古 ...

  5. python调用百度地图画轨迹图_[宜配屋]听图阁

    如题,先上效果图: 主要分为两大步骤 使用python语句,通过百度地图API,对已知的地名抓取经纬度 使用百度地图API官网的html例程,修改数据部分,实现呈现效果 一.使用python语句,通过 ...

  6. python和c++情侣网名_[宜配屋]听图阁

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  7. python读取mat文件并画图_[宜配屋]听图阁

    先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...

  8. python对数组的基本操作_[宜配屋]听图阁

    这篇文章主要介绍了简单了解python数组的基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,创建列表 创建一个列表,只要把逗号分隔的不同 ...

  9. python 判断节假日_[宜配屋]听图阁

    不废话,直接上代码Python3.6 签到代码,只需修改url,账号,密码即可,此处是登录时无验证登录,有验证码的自行补充 # -*- coding:utf-8 -*- import json imp ...

最新文章

  1. flashcom中远程共享对象SharedObject的用法
  2. 绘图中的drawRect
  3. VTK:点定位器用法实战
  4. Servlet的第一个程序HelloWorld
  5. [逆向][Writeup]ISG2015 flagfinder - .NET程序逆向
  6. 牛客练习赛71E-神奇的迷宫【点分治,NTT】
  7. 华为第二批“十大军团”正式成立!
  8. 钢条分割 动态规划java_【动态规划】初识,钢条切割问题
  9. 话里话外:明白比智慧更重要
  10. [leedcode 137] Single Number II
  11. python根据方程的y求x_用Python解方程
  12. php制作日历的代码,php日历制作代码分享_PHP教程
  13. csf播放器(csf播放器ios)
  14. 包括淘宝天猫API明细接口
  15. XShell「6.0.0111」已激活授权绿色版v2
  16. c语言开发 kdj,[转载]随机指标KDJ,及其MA、EMA、SMA、DMA介绍
  17. KMP,LCA(XJT Love Strings,玲珑杯 Round#8 A lonlife 1079)
  18. 使用IDEA+gradle构建spring5源码-手把手教程全图解
  19. postfix 安装
  20. HTML5新特性_笔记

热门文章

  1. Mac M1安装Centos7
  2. 【解决VS+QT罕见的错误】【ERROR running qmake】【qmake:乱码字符】【qmake: Error creating Makefile】
  3. 李宏毅《深度学习》- Transformer
  4. 编程语言中字面常量(literal)的详细介绍(关键词:Java,文字量,直接量,常量,常值,字面量,字面值,实字)
  5. git clone 分支
  6. 一道有趣的图形推理题
  7. AI迷路了怎么办?Facebook正在训练AI学会问路
  8. 常用网址收藏 防止迷路
  9. 4. 业务数据采集平台搭建
  10. 冲浪涨停预警,让你快速跟上涨停板通达信选股指标图解