我是靠谱客的博主 俭朴树叶,最近开发中收集的这篇文章主要介绍摄像机矩阵的分解,求解内外参矩阵(Matlab实现)1. 应用背景2. 实施原理3. RQ分解4. Matlab实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 应用背景

根据3D点与对应的2D点,能够求解得到摄像机矩阵P, P = K [ R ∣ t ] (1) rm{P}=rm{K}[rm{R}|rm{t}]tag{1} P=K[Rt](1)摄像机矩阵由内参矩阵 K rm{K} K, 外参矩阵(包括旋转 R rm{R} R和平移 t rm{t} t)组成,需要利用 P P P矩阵来求解具体的三个分量。

2. 实施原理

定义齐次坐标系下:
X bf{X} X——世界坐标系下三维点坐标,
X c a m bf{X_{cam}} Xcam——相机坐标系下三维点坐标,
x bf{x} x——像平面坐标系下二维点坐标。
P rm{P} P—— 3 x 4 3rm{x}4 3x4齐次摄像机投影矩阵
C rm{C} C——摄像机中心在世界坐标系中的坐标
在齐次坐标下,3D点到2D点的关系为 x = P X (2) bf{x}=rm{P}bf{X} tag{2} x=PX(2)根据坐标变换关系有 x = K [ I ∣ 0 ] X c a m (3) bf{x}=rm{K}[bf{I}|0]bf{X_{cam}}tag{3} x=K[I0]Xcam(3)其中 [ I ∣ 0 ] [bf{I}|0] [I0]表示矩阵分块成一个3x3单位矩阵加上一个零列矢量。
定义非齐次坐标下
X ~ bf{tilde{X}} X~——世界坐标系下三维点坐标,
X ~ c a m bf{tilde{X}_{cam}} X~cam——相机坐标系下三维点坐标,
x ~ bf{tilde{x}} x~——像平面坐标系下二维点坐标。
C ~ rm{tilde{C}} C~——摄像机中心在世界坐标系中的坐标
在非齐次下,世界坐标系下的点 X bf{X} X要转换到相机坐标系下,需要将原点通过平移 C ~ rm{tilde{C}} C~进行对齐,然后旋转 R rm{R} R来转换,该过程可表示为 X ~ c a m = R ( X ~ − C ~ ) = R X ~ + t (4) bf{tilde{X}_{cam}}=rm{R}(bf{tilde{X}}-rm{tilde{C}})=rm{R}bf{tilde{X}}+rm{t}tag{4} X~cam=R(X~C~)=RX~+t(4) 其中, R rm{R} R是3x3的旋转矩阵,平移量 t = − R C ~ rm{t}=-rm{R}rm{tilde{C}} t=RC~。该方程在齐次坐标下可以写成 X c a m = [ R − R C ~ 0 1 ] X (5) bf{X_{cam}}=begin{bmatrix} rm{R} & -rm{R}rm{tilde{C}} \ bf{0} & 1 \ end{bmatrix} bf{X}tag{5} Xcam=[R0RC~1]X(5) 与式(3)结合为 x = K R [ I ∣ − C ~ ] X (6) bf{x}=rm{K}rm{R}[rm{I}|-rm{tilde{C}}]bf{X}tag{6} x=KR[IC~]X(6)结合式(2)和式(6), P = K R [ I ∣ − C ~ ] rm{P}=rm{K}rm{R}[rm{I}|-rm{tilde{C}}] P=KR[IC~]摄像机矩阵分解的目的就是为了得到其中的参数 K rm{K} K R rm{R} R t rm{t} t。令 P rm{P} P左边 3 x 3 3rm{x}3 3x3的子矩阵为 M rm{M} M,于是 P = M [ I ∣ M − 1 p 4 ] (7) rm{P}=rm{M}[rm{I}|rm{M^{-1}}bf{p_4}]tag{7} P=M[IM1p4](7)其中, p 4 bf{p_4} p4 P rm{P} P的第4列向量,结合上式, M = K R rm{M}=rm{K}rm{R} M=KR,因为内参数矩阵 K rm{K} K是一个上三角阵,旋转矩阵 R rm{R} R是一个正交阵,因此, K rm{K} K R rm{R} R可以由 M rm{M} M矩阵通过"RQ分解"来获得。而要得到 t rm{t} t,需要先计算 C ~ rm{tilde{C}} C~。摄像机中心 C rm{C} C是使得 P C = 0 rm{PC}=0 PC=0的点,中心点 C = ( x , y , z , ω ) T rm{C}=(x,y,z,omega)^T C=(x,y,z,ω)T数值分析上可以通过SVD求解,代数上可以通过下面方法得到 x = d e t ( [ p 2 , p 3 , p 4 ] ) y = − d e t ( [ p 1 , p 3 , p 4 ] ) z = d e t ( [ p 1 , p 2 , p 4 ] ) ω = − d e t ( [ p 1 , p 2 , p 3 ] ) (8) begin{matrix} x=rm{det}([bf{p_2},bf{p_3},bf{p_4}]) & y=-rm{det}([bf{p_1},bf{p_3},bf{p_4}]) \ z=rm{det}([bf{p_1},bf{p_2},bf{p_4}]) & omega=-rm{det}([bf{p_1},bf{p_2},bf{p_3}])\ end{matrix} tag{8} x=det([p2,p3,p4])z=det([p1,p2,p4])y=det([p1,p3,p4])ω=det([p1,p2,p3])(8)进而 C ~ = ( x / ω , y / ω , z / x / ω ) rm{tilde{C}}=(x/omega,y/omega,z/x/omega) C~=(x/ω,y/ω,z/x/ω)由此,就能计算出平移量 t rm{t} t

3. RQ分解

RQ分解就是通过对待分解矩阵乘一系列的矩阵的矩阵后得到一个上三角阵’R’(这里的符号与上节代表的含义不同),然后求解正交矩阵。具体地来说,现在要分解P矩阵的子矩阵M,策略就是M右乘一系列的Givens矩阵来求解形如上三角矩阵的内参矩阵K,然后求正交的旋转矩阵R。
三维的Givens旋转是绕三个坐标轴中的一个轴进行的旋转,这三个Givens旋转分别是 Q x Q_x Qx, Q y Q_y Qy, Q z Q_z Qz
Q x = [ 1 0 0 0 c − s 0 s c ] , Q y = [ c 0 s 0 1 0 − s 0 c ] , Q z = [ c − s 0 s c 0 0 0 1 ] (9) Q_x=begin{bmatrix} 1&0&0\0&c&-s\0&s&c end{bmatrix}, Q_y=begin{bmatrix} c&0&s\0&1&0\-s&0&c end{bmatrix}, Q_z=begin{bmatrix} c&-s&0\s&c&0\0&0&1 end{bmatrix}tag{9} Qx=1000cs0sc,Qy=c0s010s0c,Qz=cs0sc0001(9)其中, c = cos ⁡ ( θ ) c=cos(theta) c=cos(θ), s = sin ⁡ ( θ ) s=sin(theta) s=sin(θ)。进行“RQ分解”分为如下三步:
3.1 乘 Q x Q_x Qx使 m 32 {m_{32}} m32为零,为了使元素 m 32 {m_{32}} m32为零,需要使得 c m 32 + s m 33 = 0 cm_{32}+sm_{33}=0 cm32+sm33=0, 此方程的解是 c = − m 33 / ( m 32 2 + m 33 2 ) ) s = m 32 / ( m 32 2 + m 33 2 ) ) (10) begin{matrix}c=-m_{33}/sqrt{(m_{32}^2+m_{33}^2))} &s=m_{32}/sqrt{(m_{32}^2+m_{33}^2))} end{matrix}tag{10} c=m33/(m322+m332)) s=m32/(m322+m332)) (10) 3.2 乘 Q y Q_y Qy使 m 31 {m_{31}} m31为零,为了使元素 m 31 {m_{31}} m31为零,需要使得 c m 31 − s m 33 = 0 cm_{31}-sm_{33}=0 cm31sm33=0, 此方程的解是 c = m 33 / ( m 31 2 + m 33 2 ) ) s = m 31 / ( m 31 2 + m 33 2 ) ) (11) begin{matrix}c=m_{33}/sqrt{(m_{31}^2+m_{33}^2))} & s=m_{31}/sqrt{(m_{31}^2+m_{33}^2))}end{matrix}tag{11} c=m33/(m312+m332)) s=m31/(m312+m332)) (11) 3.3 乘 Q z Q_z Qz使 m 21 {m_{21}} m21为零,为了使元素 m 21 {m_{21}} m21为零,需要使得 c m 21 + s m 22 = 0 cm_{21}+sm_{22}=0 cm21+sm22=0, 此方程的解是 c = − m 22 / ( m 21 2 + m 22 2 ) ) s = m 21 / ( m 21 2 + m 22 2 ) ) (12) begin{matrix}c=-m_{22}/sqrt{(m_{21}^2+m_{22}^2))} & s=m_{21}/sqrt{(m_{21}^2+m_{22}^2))}end{matrix}tag{12} c=m22/(m212+m222)) s=m21/(m212+m222)) (12)由上述三步,将 M rm{M} M矩阵的 m 21 , m 31 , m 32 m_{21},m_{31},m_{32} m21,m31,m32元素转换为0,由此得到一个上三角阵 K = M Q x Q y Q z (13) rm{K}=rm{M}Q_{x}Q_{y}Q_{z}tag{13} K=MQxQyQz(13)因此, M = K Q z T Q y T Q x T rm{M}=rm{K}Q_{z}^TQ_{y}^TQ_{x}^T M=KQzTQyTQxT,那么旋转矩阵 R = Q z T Q y T Q x T (14) rm{R}=Q_{z}^TQ_{y}^TQ_{x}^Ttag{14} R=QzTQyTQxT(14)进一步的平移向量为 t = − R C ~ (15) rm{t}=-Rrm{tilde{C}}tag{15} t=RC~(15)

4. Matlab实现

%摄像机矩阵分解
clc;clear;close all
p1 = [3.53553e2; -1.03528e2; 7.07107e-1];
p2 = [3.39645e2; 2.33212e1; -3.53553e-1];
p3 = [2.77744e2; 4.59607e2; 6.12372e-1];
p4 = [-1.44946e6; -6.32525e5 ;-9.18559e2];
P = [p1,p2,p3,p4];
x = det([p2,p3,p4]);
y = -det([p1,p3,p4]);
z = det([p1,p2,p4]);
w = -det([p1,p2,p3]);
C = [x/w;y/w;z/w];
M = P(1:3,1:3);
if det(M) ~= 0
%乘Qx,使M(3,2)0
c = -M(3,3)/sqrt(M(3,2)*M(3,2)+M(3,3)*M(3,3));
s = M(3,2)/sqrt(M(3,2)*M(3,2)+M(3,3)*M(3,3));
Qx = [1,0,0; 0,c,-s; 0,s,c];
M = M*Qx
%乘Qy,使M(3,1)0,并且不改变M(3,2)
c = M(3,3)/sqrt(M(3,1)*M(3,1)+M(3,3)*M(3,3));
s = M(3,1)/sqrt(M(3,1)*M(3,1)+M(3,3)*M(3,3));
Qy = [c,0,s; 0,1,0; -s,0,c];
M = M*Qy
%乘Qz,使M(2,1)0,并且不改变M(3,2),M(3,1)
c = -M(2,2)/sqrt(M(2,1)*M(2,1)+M(2,2)*M(2,2));
s = M(2,1)/sqrt(M(2,1)*M(2,1)+M(2,2)*M(2,2));
Qz = [c,-s,0; s,c,0; 0,0,1];
M = M*Qz
%上三角阵R=M*Qx*Qy*Qz,正交阵Q=Qz^T*Qy^T*Qx^T
K = M
R = Qz'*Qy'*Qx'
end
t = -R*C

最后

以上就是俭朴树叶为你收集整理的摄像机矩阵的分解,求解内外参矩阵(Matlab实现)1. 应用背景2. 实施原理3. RQ分解4. Matlab实现的全部内容,希望文章能够帮你解决摄像机矩阵的分解,求解内外参矩阵(Matlab实现)1. 应用背景2. 实施原理3. RQ分解4. Matlab实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部