1. 程式人生 > >單應矩陣H,求解及影象透射變換warpPerspective

單應矩陣H,求解及影象透射變換warpPerspective

1.代數求解

在這裡插入圖片描述K為內參,R為旋轉矩陣

2.函式求解

getPerspectiveTransform()和findHomography()

都用於計算單應性矩陣,即解一個線性方程組。由於單應矩陣有8個未知數(3*3,其中第9個數為1),所以至少需要4個點(每個點-x,y,提供2個約束方程)。

getPerspectiveTransform用的是SVD分解,getPerspectiveTransform只會拿前4個點去計算,getPerspectiveTransform()比較簡單粗暴。
findHomography則會拿一堆點(>=4)去計算(其是不斷從一堆點中重複拿出4個點去計算出一個結果,再採用一些優化演算法RANSAC/LMEDS去篩選出最優解)。

3.影象透射變換warpPerspective

import sys
import math
ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
if ros_path in sys.path:
    sys.path.remove(ros_path)
import cv2
sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')
import numpy as np
K1=np.matrix([[1504.72958809729,0,965.092514870106],
[0,1407.38572229267,569.748552278095],
[0,0,1]])
K3=np.matrix([[1501.83680551596,0,813.810666146807],
[0,1398.24220677846,560.287775632716],
[0,0,1]])
R1=np.matrix([[1,0,0],
[0,1,0],
[0,0,1]])

R3=np.matrix([[0.8560 ,   0.0170 ,  -0.5167],
   [-0.0351   , 0.9991   ,-0.0253],
    [0.5158  ,  0.0398  ,  0.8558]])
img=cv2.imread("/home/XXX/F/image/3/3.jpg")
H=K3*R1*R3.I*K1.I
res = cv2.warpPerspective(img,H,(4000,2000))
cv2.namedWindow("1",0)
cv2.imshow("1",res)
cv2.waitKey(0)