假设原始图像上特征点坐标为 xi=(ui,vi,1)x_i=(u_i,v_i,1)xi=(ui,vi,1),目标图像上的坐标为xi′=(ui′,vi′,1)x_i'=(u_i',v_i',1)xi′=(ui′,vi′,1)
假设 HHH 为两者之间的变换关系。
Hxi=[h1h2h3h4h5h6h7h8h9][uivi1]=[h1Txih2Txih3Txi]=[xiTh1xiTh2xiTh3]=[ui′vi′1]Hx_i= \begin{bmatrix} h_1&h_2&h_3\\h_4&h_5&h_6\\h_7&h_8&h_9 \end{bmatrix} \begin{bmatrix} u_i\\v_i\\1 \end{bmatrix} =\begin{bmatrix} h^{1T}x_i\\h^{2T}x_i\\h^{3T}x_i\end{bmatrix}= \begin{bmatrix}x_i^Th^1\\x_i^Th^2\\x_i^Th^3\end{bmatrix}= \begin{bmatrix}u_i'\\v_i'\\1 \end{bmatrix}Hxi=⎣⎡h1h4h7h2h5h8h3h6h9⎦⎤⎣⎡uivi1⎦⎤=⎣⎡h1Txih2Txih3Txi⎦⎤=⎣⎡xiTh1xiTh2xiTh3⎦⎤=⎣⎡ui′vi′1⎦⎤
hih_ihi代表 H 矩阵第 i 行的列向量表示。
可以通过xi′⋅xix_i'\cdot x_ixi′⋅xi得到三个线性方程:
{xiTh3xiTh1=1ui′xiTh3xiTh2=1vi′xiTh2xiTh1=vi′ui′→{vi′xih3−xiTh2=0ui′xiTh3−xiTh1=0ui′xiTh2−vi′xiTh1=0→[03×1T−xiTvi′xiTxiT03×1T−ui′xiT−vi′xiTui′xiT03×1T][h1h2h3]=0\begin{cases} \frac{x_i^Th^3}{x_i^Th_1}=\frac{1}{u_i'}\\ \frac{x_i^Th^3}{x_i^Th_2}=\frac{1}{v_i'}\\ \frac{x_i^Th^2}{x_i^Th_1}=\frac{v_i'}{u_i'} \end{cases} \rightarrow \begin{cases} v_i'x_ih^3-x_i^Th_2=0\\ u_i'x_i^Th_3-x_i^Th_1=0\\ u_i'x_i^Th_2-v_i'x_i^Th_1=0 \end{cases} \rightarrow \begin{bmatrix} 0_{3\times1}^T&-x_i^T&v_i'x_i^T\\x_i^T&0_{3\times1}^T&-u_i'x_i^T\\-v_i'x_i^T&u_i'x_i^T&0_{3\times1}^T \end{bmatrix} \begin{bmatrix} h^1\\h^2\\h^3 \end{bmatrix} =0⎩⎪⎪⎪⎨⎪⎪⎪⎧xiTh1xiTh3=ui′1xiTh2xiTh3=vi′1xiTh1xiTh2=ui′vi′→⎩⎪⎨⎪⎧vi′xih3−xiTh2=0ui′xiTh3−xiTh1=0ui′xiTh2−vi′xiTh1=0→⎣⎡03×1TxiT−vi′xiT−xiT03×1Tui′xiTvi′xiT−ui′xiT03×1T⎦⎤⎣⎡h1h2h3⎦⎤=0
即有Ai(3)h=0A_i^{(3)}h=0Ai(3)h=0 对于图像片的每一个点。AiA_iAi 是一个 3×93\times93×9 矩阵,因为 AAA 的最后一行是由另外两行确定,所以只需要计算线性方程 A^ih^=0\hat A_i \hat h=0A^ih^=0。这里的A^i\hat A_iA^i由Ai(3)A_i^{(3)}Ai(3)的前两行组成。A 的矩阵表示为:
在估计H时,可以使用更多的匹配点信息来减少估计误差。选取前两行组成一个独立的系数矩阵Ai,将所有的匹配点都考虑在内,形成一个2N × 9的系数矩阵a。用最小二乘法,h的解可以表示为
求解上述公式存在两种方式:
# Ametrix to solv DLTdef matrix_generate(sample_n, cf1, cf2):"""AH=b生成A没对样本能生成一行[[0,0,0,-x,-y,1,xy',yy',y'],[x,y,1,0,0,0,-xx',-yx',-x']]:param sample_n::param cf1: 点1:param cf2::return: A [2N,9]"""A = np.zeros([sample_n * 2, 9], dtype=np.float)for k in range(sample_n):# 每对点对应量A[2 * k, 0] = cf1[k, 0]A[2 * k, 1] = cf1[k, 1]A[2 * k, 2] = 1A[2 * k, 6] = (-cf2[k, 0]) * cf1[k, 0]A[2 * k, 7] = (-cf2[k, 0]) * cf1[k, 1]A[2 * k, 8] = (-cf2[k, 0])A[2 * k + 1, 3] = cf1[k, 0]A[2 * k + 1, 4] = cf1[k, 1]A[2 * k + 1, 5] = 1A[2 * k + 1, 6] = (-cf2[k, 1]) * cf1[k, 0]A[2 * k + 1, 7] = (-cf2[k, 1]) * cf1[k, 1]A[2 * k + 1, 8] = (-cf2[k, 1])return Adef compute_H(src_points,dst_points):A = self.matrix_generate(sample_n, cf1, cf2)# SVD 奇异值求解# Singular Value DecompositionW, U, V = cv2.SVDecomp(A)# get global-homographyh = V[-1, :]h = h.reshape((3, 3))# 反归一化用与还原h = h / h[2, 2]return h
第二种方式,以四组点为例,暂未补充
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态