本文将尝试对照相机进行建模并有效地使用这些模型。

(该实验参书籍:Python计算机视觉编程 第四章)

(代码为书上源码)

1.1 照相机标定

标定照相机是指计算出该照相机的内参数。其标准方法是,拍摄多幅平面棋盘模式的图像,然后进行处理计算。

这里将要介绍一个简单的照相机标定方法。大多数参数可以使用基本的假设来设定(正方形垂直的像素,光心位于图像中心),比较难处理的是获得正确的焦距。对于这种标定方法,需要准备一个平面矩形的标定物体(例如书本)、用于测量的卷尺和直尺,以及一个平面。
下面是具体操作步骤:

①测量你选定的矩形标定物体的边长dX和dY;
②将照相机和标定物体放置在平面上,使得照相机的背面好标定物体平行,同时物体位于照相机图像视图的中心,你可能需要调整照相机或者物体来获得良好的对齐效果;
③测量标定物体到照相机的距离dZ;
④拍摄一副图像来检验该设置是否正确,即标定物体的边要和图像的行和列对齐;
⑤使用像素数来测量标定物体图像的宽度和高度dx和dy。

利用下面的公式可获得焦距:
fx=dx/dXdZ , fy=dy/dYdZ

1.2 以平面和标记物进行姿态估计

如果图像中包含平面状的标记物体,并且已经对照相机进行了标定,那么就可以计算出照相机的姿态(旋转和平移)。

使用平面物体作为标记物,来计算用于新视图投影矩阵的例子。

将图像的特征和对齐后进行标记匹配。
用RANSAC计算出的单应性矩阵用于计算照相机的姿态。

2.1 增强现实具体实例

实现增强现实我们需要用到PyGame和PyOpenGL两个工具包。(下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/,在里面找到pygame和pyopengl,下载对应python的版本的whl文件)

PyGame是非常流行的游戏开发工具包,它可以简单的处理现实窗口、输入设备等等

PyGame可以直接pip install pygame安装

PyOpenGL是OpenGL图形编程的Python绑定接口,

PyOpenGL就直接按照开头的安装方法就行

下面直接给出实现在一张图像上放置一个3D茶壶的代码,基本都是书上原本的,稍微做了一些修改用来读取之前生成的视频图片并对每一张图片进行现实增强。(有些需要更改为自己的数据的地方我会注释一下)

import math
import pickle
from pylab import *
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import pygame, pygame.image
from pygame.locals import *
from PCV.geometry import homography, camera
from PCV.localdescriptors import siftdef cube_points(c, wid):""" Creates a list of points for plottinga cube with plot. (the first 5 points arethe bottom square, some sides repeated). """p = []# bottomp.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]) #same as first to close plot# topp.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]) #same as first to close plot# vertical sidesp.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).Tdef my_calibration(sz):row, col = szfx = 2555*col/2592fy = 2586*row/1936K = diag([fx, fy, 1])K[0, 2] = 0.5*colK[1, 2] = 0.5*rowreturn Kdef 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.0gluPerspective(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] = tM = M.Tm = 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")    # compute features
sift.process_image('book_frontal.JPG', 'im0.sift')
l0, d0 = sift.read_features_from_file('im0.sift')sift.process_image('book_perspective.JPG', 'im1.sift')
l1, d1 = sift.read_features_from_file('im1.sift')# match features and estimate homography
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)K = my_calibration((747, 1000))
cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]])))))
box = cube_points([0, 0, 0.1], 0.1)
box_cam1 = cam1.project(homography.make_homog(box[:, :5]))
box_trans = homography.normalize(dot(H,box_cam1))
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)Rt=dot(linalg.inv(K),cam2.P)setup()
draw_background("book_perspective.bmp")
set_projection_from_camera(K)
set_modelview_from_camera(Rt)
draw_teapot(0.05)pygame.display.flip()
while True: for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()

2.2 结果图

OpenGL照相机模型与增强现实相关推荐

  1. Python计算机视觉——照相机模型与增强现实

    Python计算机视觉--照相机模型与增强现实 文章目录 Python计算机视觉--照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 ...

  2. Python计算机视觉——第四章 照相机模型与增强现实

    文章目录 引言 4.1 针孔照相机模型 4.1.1 投影矩阵 4.1.2 三维点的投影 4.1.3 照相机矩阵的分解 4.1.4 计算照相机中心 4.2 照相机标定 4.2.1 相机参数标定实验 4. ...

  3. Python计算机视觉编程第四章——照相机模型与增强现实

    Python计算机视觉编程 照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记 ...

  4. Python计算机视觉编程第四章 照相机模型与增强现实

    照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 照相机中心 2 照相机标定 3 以平面和标记物进行姿态估计 4 增强现实 4.1 ...

  5. Python计算机视觉编程学习笔记 四 照相机模型与增强现实

    照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机模型 1.2 三维点的投影 1.3照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 ...

  6. 四、【python计算机视觉编程】照相机模型与增强现实

    照相机模型与增强现实 (一)针孔照相机模型 (1)照相机矩阵 (2)三维点的投影 (3)照相机矩阵的分解 (4)计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 (A ...

  7. 照相机模型与增强现实(相机标定)

    计算机视觉:照相机模型与增强现实 针孔照相机模型 照相机标定 光学标定 自标定(SFM) 实验结果 本篇文章主要讲述如何通过通过照相机模型在映射中加入部分照相机产生图像过程的投影特性从而 处理三维图像 ...

  8. 第四章 照相机模型与增强现实

    一.针孔照相机模型 针孔照相机模型(有时称为射影照相机模型)是计算机视觉中广泛使用的照相机模型.对于大多数应用来说,针孔照相机模型简单,并且具有足够的精确度.这个名字源于一种类似暗箱机的照相机,该照相 ...

  9. python计算机视觉 第四章照相机模型与增强现实

    文章目录 引言 4.1针孔照相机模型 4.1.1照相机矩阵 4.1.2三维点的投影 4.1.3照相机矩阵分解 4.1.4计算照相机中心 4.2照相机标定 4.2.1一个简单地标定方法 4.3以平面和标 ...

最新文章

  1. 数据中心网络架构 — 云数据中心网络 — 新型叶脊二层网络架构
  2. golang 接口类型 interface 简介
  3. dedecms 如何调用多个不同栏目的文章_SEO排名,同一篇文章,在多个栏目,如何处理?...
  4. gcc 删除elf_ELF文件格式解析器 原理 + 代码
  5. ACM常用之 异或运算的性质。
  6. wordpress 主题教程-笔记
  7. 十步教你如何接手别人的代码!
  8. 编写一个Applet,随机选择矩形、圆形、椭圆、直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充。
  9. Tensorflow Day1
  10. JavaWeb开发——JSP技术
  11. 今日头条抖音小程序开发文档
  12. linux系统出现BUG:softlockup- CPU#0 STUCK FOR 23s 或 rcu_sched self-detected stall on cpu 等字样的解决办法
  13. 微信小程序怎么添加到主屏幕将微信小程序放到手机桌面?
  14. 华为OD机试真题 Java 实现【完美走位】【2022.11 Q4】
  15. excel怎么拆分成多个独立表格文件
  16. __attribute__((section(”name“)))的一些理解
  17. 控制器模式_前控制器模式简介,第1部分
  18. 计算机原理基本概念整理
  19. html同时播放多个文件夹,ios – 如何同时播放多个音频文件
  20. 【C++模板编程入门】模板介绍、模板定义、函数模板、类模板、模板的继承

热门文章

  1. java newline_Java BufferedWriter newLine()方法
  2. 《快速掌握PyQt5》
  3. 腾讯邮箱比阿里邮箱好,腾讯邮箱还是阿里邮箱?
  4. 首席新媒体运营黎想教程:电商运营必须掌握的5个公式
  5. lms全称是什么意思_LMS是什么意思
  6. python发送email
  7. PseudoSeg: Designing Pseudo Labels for Semantic Segmentation阅读笔记
  8. [强化学习实战]马尔可夫决策-悬崖寻路python实现
  9. 深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)
  10. 插上移动硬盘计算机没反应,usb硬盘插上电脑没反应怎么办,手把手教你怎么解决...