Python:计算机视觉进行图像的拼接

一、实验要求

1、利用单应矩阵的变换实现全景图像的拼接

二、实验结果

Python:计算机视觉进行图像的拼接_第1张图片Python:计算机视觉进行图像的拼接_第2张图片

Python:计算机视觉进行图像的拼接_第3张图片

三、实验代码

import cv2
import matplotlib.pyplot as plt
import numpy as np
leftgray = cv2.imread('path1')
rightgray = cv2.imread('path2')
hessian=1000
surf=cv2.xfeatures2d.SURF_create(hessian) #将Hessian Threshold设置为400,阈值越大能检测的特征就越少
kp1,des1=surf.detectAndCompute(leftgray,None) #查找关键点和描述符
kp2,des2=surf.detectAndCompute(rightgray,None)

FLANN_INDEX_KDTREE=0 #建立FLANN匹配器的参数
indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5) #配置索引,密度树的数量为5
searchParams=dict(checks=50) #指定递归次数
#FlannBasedMatcher:是目前最快的特征匹配算法(最近邻搜索)
flann=cv2.FlannBasedMatcher(indexParams,searchParams) #建立匹配器
matches=flann.knnMatch(des1,des2,k=2) #得出匹配的关键点
good=[] #提取优秀的特征点

for m,n in matches:
    if m.distance < 0.5*n.distance:
        good.append(m)
        src_pts = np.array([ kp1[m.queryIdx].pt for m in good]) #查询图像的特征描述子索引
        dst_pts = np.array([ kp2[m.trainIdx].pt for m in good]) #训练(模板)图像的特征描述子索引
        H=cv2.findHomography(src_pts,dst_pts) #生成变换矩阵
        
h1,w1=leftgray.shape[:2]
print(h1,w1)
h2,w2=rightgray.shape[:2] 
# print(h2,w2)
shft=np.array([[1.0,0,w1],[0,1.0,0],[0,0,1.0]])
# print(shft)
M=np.dot(shft,H[0]) #获取左边图像到右边图像的投影映射关系  H[0]第一行
# print(M)
dst_corners=cv2.warpPerspective(leftgray,M,(w1*2,h1))#透视变换,新图像可容纳完整的两幅图
# print(dst_corners)

cv2.imshow('tiledImg1',dst_corners) #显示,第一幅图已在标准位置
dst_corners[0:h1,w1:w1*2]=rightgray #将第二幅图放在右侧
cv2.imwrite('tiled.jpg',dst_corners)
cv2.imshow('tiledImg',dst_corners)
cv2.imshow('leftgray',leftgray)
cv2.imshow('rightgray',rightgray)
cv2.waitKey()
cv2.destroyAllWindows()

调用cv2.findHomography ()函数进行单应矩阵的计算

利用cv2.warpPerspective()进行透视变换,形成可容纳完整两幅图的新图像

hessian参数和m.distance < x*n.distance中的x参数可变,进行不同图像的适应变换

其中:hessian为阈值,值越大能检测出的特征就越少

1、opencv surf()函数

(opencv应该更改为较早的版本,新的已经申请专利)

surf=cv2.xfeatures2d.SURF_create(hessian)
kp, des = surf.detectAndCompute(img,None)

 (1)kp参数

angle:角度,表示关键点的方向,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向。-1为初值。

classid:当要对图片进行分类时,我们可以用classid对每个特征点进行区分,未设定时为-1,需要靠自己设定

octave:代表是从金字塔哪一层提取的得到的数据。

pt:关键点点的坐标

response:响应程度,代表该点强壮大小,更确切的说,是该点角点的程度。

size:该点直径的大小

2、FLANN匹配器

是一个对大数据集和高维特征进行最近邻搜索的算法的集合

第一个字典是indexParams。

indexparams=dict(algorithm = FLANNINDEX_KDTREE,trees=5)

第二个字典是SearchParams。

它用来指定递归遍历的次数。值越高结果越准确,但是消耗的时间也越多。 searchParams=dict(checks=50)

你可能感兴趣的:(python,计算机视觉,opencv)