针孔照相机模型(有时称为射影照相机模型)是计算机视觉中广泛使用的照相机模型。对于大多数应用来说,针孔照相机模型简单,并且具有足够的精准度。这个名字来源于一种类似暗箱机的照相机。该照相机从一个小孔采集射到暗箱内部的光线。在光线投影到图像平面之前,从唯一一个点经过,也就是照相机中心C。
在针孔照相机中,三维点X投影为图像点x(两个点都是用齐次坐标表示的),如下所示:
照相机矩阵可以分解为:
标定矩阵仅和照相机自身的情况相关,通常情况下可以写成:
这里,我们使用了另外的记号fx和fy,两者关系为fx=αfy。
纵横比例参数α是在像素元素非正方形的情况下使用的。通常情况下,我们还可以默认设置α=1.经过这些假设,标定矩阵变为:
除焦距之外,标定矩阵中剩余的唯一参数为光心(有时称为主点)的坐标c=[cx,cy],也就是光线坐标轴和图像平面的交点。因为光心通常在图像的中心,并且图像的坐标是从左上角开始计算的,所以光心的坐标常接近于图像宽度和高度的一半。特别强调一点,这这个例子中,唯一未知的变量是焦距f。1.2 三维点的投影
下面来创建照相机类,用来处理我们对照相机和投影建模所需要的全部 *** 作:
from scipy import linalgfrom pylab import *class Camera(object): """表示针孔照相机的类""" def __init__(self, P): """初始化 P = K[R|t] 照相机模型""" self.P = P self.K = None # 标定矩阵 self.R = None # 旋转 self.t = None # 平移 self.c = None # 照相机中心 def project(self, X): """X(4×n的数组)的投影点,并进行坐标归一化""" x = dot(self.P, X) for i in range(3): x[i] /= x[2] return x def rotation_matrix(a): """创建一个用于围绕向量a轴旋转的三维旋转矩阵""" R = eye(4) R[:3,:3] = linalg.expm([0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]) return R
1.3 照相机矩阵的分解如果给定方程(1.1节中)所示的照相机矩阵P,我们需要恢复内参数K以及照相机的位置t和姿势R。矩阵分块 *** 作称为因子分解。这里,我们将使用一种矩阵因子分解的方法,称为RQ因子分解。
将下面的方法添加到Carmera类中:
def factor(self): """将照相机矩阵分解为 K,R,t,其中, R=K[R|t]""" # 分解前3×3的部分 K,R = linalg.rq(self.P[:,:3]) # 将K的对角线元素设为正值 T = diag(sign(diag(K))) if linalg.det(T) < 0: T[1,1] *= -1 self.K = dot(K,T) self.R = dot(T,R) # T的逆矩阵为其自身 self.t = dot(linalg.inv(self.K), self.P[:,3]) return self.K, self.R, self.t
RQ因子分解的结果并不是唯一的。在该因子分解中,分解的结果存在符号二义性。由于我们需要限制旋转矩阵R为正定的(否则,旋转坐标轴即可),所以如果需要,我们可以在求解到的结果中加入变换T来改变符号。
在示例照相机上运行下面的代码,观察照相机矩阵分解的效果:
if __name__=='__main__': K = array([[1000,0,500],[0,1000,300],[0,0,1]]) tmp = Camera.rotation_matrix([0,0,1])[:3,:3] Rt = hstack((tmp,array([[50],[40],[30]]))) cam = Camera(dot(K,Rt)) print(K,Rt) print(cam.factor())
1.4 照相机中心给定照相机投影矩阵P,我们可以计算出空间上照相机的所在位置。照相机的中心C,是一个三维点,满足约束PC=0。对于投影矩阵为P=K[R|t]的照相机,有:
照相机的中心可以由下述式子来计算:
注意,如预期一样,照相机的中心和内标定矩阵K无关。
下面的代码可以按照上面公式计算照相机的中心。将其添加到Camera类中,该方法会返回照相机的中心:
def center(self): """计算并返回照相机的中心""" if self.c is not None: return self.c else: # 通过因子分解计算c self.factor() self.c = -dot(self.R.T, self.t) return self.c
二、照相机标定标定照相机是指计算出该照相机的内参数。在我们的例子里,是指计算矩阵K。如果你的应用要求高精度,那么可以扩展该照相机模型,使其包含径向畸变和其他条件。对于大多数应用来说,我们在1.1节中s=0的K公式中的简单照相机模型已经足够。标定照相机的标准方法,拍摄多幅平面期盼模型的图像,然后进行处理计算。
总结以上是内存溢出为你收集整理的Python计算机视觉编程--第四章全部内容,希望文章能够帮你解决Python计算机视觉编程--第四章所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)