文章目录

  • 照相机模型
    • 1 针孔照相机模型
      • 1.1 照相机矩阵
      • 1.2 三维点的投影
      • 1.3 照相机矩阵的分解
      • 1.4 计算照相机中心
    • 2 照相机标定
    • 3 以平面和标记物进行姿态估计
    • 4 总结

照相机模型

1 针孔照相机模型

针孔照相机模型是计算机视觉中广泛使用的照相机模型。该相机从一个小孔采集射到暗箱内部的光线。在真空照相机模型中,在光线投射到图像平面之前,从唯一一个点经过。

图1 针孔照相机模型
在图中示出了与针孔相机映射有关的几何形状。该图包含以下基本对象:

  • 一个原点在O点的三维正交坐标系,这也是相机光圈的位置。坐标系的三个轴被称为X1、X2、X3。X3轴指向相机的观察方向,称为光轴、主轴或主射线。由轴X1和X2张成的平面是相机的正面,或称主平面。
  • 一个像平面,其中三维世界通过相机光圈进行投影。像平面平行于轴X1和X2,并且在X3轴的负方向上与原点O距离为f,其中f是针孔相机的焦距。针孔相机的实际实现意味着像平面的位置应使与X3轴在坐标-f处相交,其中f>0。
  • 在光轴和像平面相交处的点R,该点称为主点或图像中心。
  • 真实世界中的某一点P,有相对于轴X1、X2、X3的坐标(x1,x2,x3)。点P在相机中的投影线。也就是图中穿过点P和点O的绿线。点P在像平面上的投影,记作点Q。这个点由投影线(绿色)与像平面的交点表示。在任何实际情况下,我们可以假设x3>0,这意味着交点是定义良好的。
  • 在像平面上也有一个二维坐标系:原点在R,轴Y1和Y2分别平行于X1和X2。点Q相对于这个坐标系的坐标是(y1,y2)。

具体相关信息参考:https://zhuanlan.zhihu.com/p/124298599;https://blog.csdn.net/lsh_2013/article/details/47615309

1.1 照相机矩阵

照相机矩阵可以分解为:

其中,R是描述照相机方向的旋转矩阵,t是描述照相机中心位置的三维平移向量,内标定矩阵K描述照相机的投影性质。标定矩阵仅和照相机自身的情况相关,通常情况下可以写成:

图像平面和照相机中心的距离称为焦距f。当像素数组在传感器上偏斜的时候,需要用到倾斜参数s。在大多数情况下s可以设置为0。

纵横比例α是在像素元素非正方形的情况下使用的,通常情况下可以默认设置α=1。

除焦距之外,标定矩阵中剩余的唯一参数为光心,即主点,也就是光线坐标轴和图像平面的交点。因为光心通常在图像的中心,并且图像的坐标是从左上角开始计算的,所以光心的坐标常接近于图像高度和宽度的一半。

1.2 三维点的投影

创建一个照相机类,用来处理对照相机和投影建模所需要的全部操作:

from scipy.import linalgclass Camera(object):def _init_(self, p):self.p = pself.K = Noneself.R = Noneself.t = Noneself.c = Nonedef project(self, x):x = dot(self.P, X)for i in range(3):x[i] /= x[2]return x

下边的例子将三维中的点投影到图像视图中:

from PIL import Image
from pylab import *
from numpy import *
import camerapoints = loadtxt('house.p3d').T
points = vstack((points, ones(points.shape[1])))P = hstack((eye(3), array([[0], [0], [-10]])))
cam = camera.Camera(P)
x = cam.project(points)figure()
plot(x[0], x[1], 'k.')
show()

首先使用齐次坐标表示这些点,然后使用一个投影矩阵来创建Camera对象将这些三维点投影到图像平面并执行绘制操作,得到的结果如下图所示:

图2 图像视图投影后的点
下边的代码围绕这个随机的三维变量进行增量旋转的投影,使用rotation_matrix()函数创建了一个进行三维旋转的旋转矩阵,可以运行代码多次进行不同的随机旋转并观察结果。
图3 照相机旋转后的三种投影轨迹

1.3 照相机矩阵的分解

如果给定一个照相机矩阵P,需要恢复内参数K以及照相机的位置t和姿势R,这种矩阵分块操作称为因子分解。

下面的代码使用RQ银子分解的方法。但这种分解方法的结果并不是唯一的,分解的结果存在二义性。由于需要限制旋转矩阵R为正定的,所以如果需要可以在求解的结果中加入变换T来改变符号。

def factor(self):K, R = li.rq(self.P[:, :3])T = diag(sign(diag(K)))if li.det(T) < 0:T[1, 1] *= -1self.K = dot(K, T)self.R = dot(T, R)self.t = dot(li.inv(self.K), self.P[:, 3])return self.K, self.R, self.t

1.4 计算照相机中心

给定照相机投影矩阵P,可以计算出空间上照相机的所在位置。照相机中心为C,是一个三维点,满足约束条件PC=0。对于投影矩阵为P=K[R|t]照相机可以通过下述式子计算C:

下面的代码可以按照上述公式返回机选照相机的中心:

def center(self):if self.c is not None:return self.celse:self.factor()self.c = -dot(self.R.T, self.t)return self.c

2 照相机标定

标定照相机是指计算出该照相机的内参数。

具体步骤如下:

  • 测量你选定矩形标定物体的变长dX和dY;
  • 将照相机和标定物体放置在平面上,使得照相机的背面和标定物体平行,同时物体位于照相机图像视图的中心;
  • 测量标定物体到照相机的距离dZ;
  • 拍摄一幅图像来检验该设置是否正确,即标定物体的边要和图像的行和列对齐;
  • 使用像素数来测量标定物体图像的宽度和高度。

测量到的数据写入一个辅助函数:

def my_calibration(sz):row, col = szfx = 3158 * col / 4032fy = 3019 * row / 3024K = diag([fx, fy, 1])K[0, 2] = 0.5 * colK[1, 2] = 0.5 * rowreturn K

该函数的输入参数为表示图像大小的元组,返回参数为标定矩阵。

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

使用下面的代码提取两幅图像的SIFT特征,然后使用RANSAC算法稳健地估计单应性矩阵:

sift1.process_image('qinghai1.jpg', 'im0.sift')
l0, d0 = sift.read_features_from_file('im0.sift')sift1.process_image('qinghai2.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[ndx, :2].T)model = homography.RansacModel()
H = homography.H_from_ransac(fp, tp, model)

该单应性矩阵将一幅图像中标记物上的点映射到另一幅图像中的对应点。定义相应的三维坐标系,使标记物在X-Y平面上,原点在标记物的某位置上。

为了检验单应性矩阵结果的正确性,需要将一些简单的三维物体放置在标记物上,下边的函数用来产生立方体上的点:

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

接下来可以实现两个视图间的相对变换:

K = my_calibration((747, 1000))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]))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)box_cam2 = cam2.project(homography.make_homog(box))

第一个产生的标定矩阵就是在该图像分辨率大小下的标定矩阵,cube_points()函数产生的前五个点对应与立方体底部的点。

使用下边的代码来可视化这些投影后的点:

im0 = array(Image.open('qinghai1.jpg'))
im1 = array(Image.open('qinghai2.jpg'))figure()
imshow(im0)
plot(box_cam1[0, :], box_cam1[1, :], linewidth=3)
title('2D projection of bottom square')
axis('off')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')show()

为了能够之后再次使用,可以使用Pickle将这些照相机矩阵保存起来:

import picklewith open('ar_camera.pkl', 'w') as f:pickle.dump(K, f)pickle.dump(dot(linalg.inv(K), cam2.P), f)

图4 使用计算出的照相机矩阵变换立方体

4 总结

这一部分从计算给定平面场景物体的照相机矩阵入手,结合特征匹配和单应性矩阵以及照相机标定技术,完成在一幅图像上放置一个立方体。有了照相机姿态估计技术,就可以学习如何创建简单增强现实应用的基本技术。

计算机视觉编程——照相机模型相关推荐

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

    文章目录 4.1针孔照相机模型 4.1.1 照相机矩阵 4.1.2三维点的投影 4.1.3照相机矩阵的分解 4.2 照相机标定 4.3 以平面和标记物进行姿态估计 4.4 增强现实 4.4.1 PyG ...

  2. 【计算机视觉】照相机模型与增强现实

    1.照相机标定 标定照相机是指计算出该照相机的内参数. def my_calibration(sz):"""Calibration function for the ca ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  2. SUSE Linux 维护笔记二
  3. 解决Based on configured schedule, the given trigger ‘triggerGroupName_FREEZE_JOB.triggerName_FREEZE...
  4. npm常用命令(扩展中...)
  5. 扑克牌自定义排序,使用集合TreeSet实现实体对象排序,通过实现Comparable接口,重写compareTo比较器;
  6. python zip函数_Python zip()函数
  7. php找零页面,找零问题
  8. Ajax模拟Form表单提交,含多种数据上传
  9. 【JAVA】第十一届蓝桥杯省模拟赛答案(本科组)
  10. cs1.6修改服务器参数设置,[心得] cs的网络参数调整指南
  11. pocketpc同步驱动_PocketPC上的NewsBreak RSS Feed阅读器和播客
  12. Python开源Devops定时任务管理系统(含定时调用接口、定时ssh远程执行命令)
  13. 已解决-Mounty 挂载NTFS报错:卷“BOOTCAMP“不可重新挂载
  14. 华为的全闪存存储之路
  15. 35_mac小目标5_神器Alfred的作用,安装,破解,使用
  16. Linux中update和upgrade的区别
  17. 酷派童年童装×××随
  18. 【python游戏制作】僵尸来袭 ~ 快来一起创造植物叭~
  19. Wireshark搜索关键字内容
  20. 终极计算机配置要求,《看门狗》PC版终极配置要求 i7+GTX780+8G包爽

热门文章

  1. 【WSN同步捕获】无线传感器网络的同步捕获和跟踪误差的MATLAB仿真
  2. 基于MATLAB的小波去噪
  3. stm32使用rtc到底用LSI还是LSE
  4. C++类与new和delete操作符
  5. C++ new和delete操作符
  6. Python3的深拷贝和浅拷贝
  7. javaScript中变量作用域
  8. [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题
  9. Git常用命令速查表
  10. 802.11ac/ax (wifi6)中的Beamforming技术介绍