单应矩阵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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
单应矩阵是指在计算机视觉中用于图像处理的一种变换矩阵。在Python中,我们可以使用OpenCV库来计算单应矩阵。 首先,我们需要导入OpenCV库: ```python import cv2 import numpy as np ``` 然后,我们可以读取两张图片并提取特征点: ```python img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 使用SIFT算法提取特征点 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) ``` 接下来,我们可以使用FLANN算法来匹配两张图片的特征点: ```python # 创建FLANN匹配器 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 在两张图片的特征点中进行匹配 matches = flann.knnMatch(des1,des2,k=2) ``` 然后,我们需要筛选出匹配点对: ```python good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append(m) # 获取匹配点对的坐标 pts1 = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1,1,2) pts2 = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1,1,2) ``` 最后,我们可以使用cv2.findHomography()函数来计算单应矩阵: ```python # 计算单应矩阵 H, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC,5.0) # 输出单应矩阵 print(H) ``` 这样,我们就可以得到两张图片之间的单应矩阵了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值