python如何将两张图片生成为全景图片
本文实例为大家分享了python将两张图片生成全景图片的具体代码,供大家参考,具体内容如下
1、全景图片的介绍
全景图通过广角的表现手段以及绘画、相片、视频、三维模型等形式,尽可能多表现出周围的环境。360全景,即通过对专业相机捕捉整个场景的图像信息或者使用建模软件渲染过后的图片,使用软件进行图片拼合,并用专门的播放器进行播放,即将平面照片或者计算机建模图片变为360度全观,用于虚拟现实浏览,把二维的平面图模拟成真实的三维空间,呈现给观赏者。
2、如何实现
2.1、实现原理
主要是利用sift的特征提取与匹配,参考链接
2.2、实现代码
#-*-coding:utf-8-*-
u'''
Createdon2019年6月14日
@author:wuluo
'''
__author__='wuluo'
__version__='1.0.0'
__company__=u'重庆交大'
__updated__='2019-06-14'
importnumpyasnp
importcv2ascv
fromPILimportImage
frommatplotlibimportpyplotasplt
print('cvversion:',cv.__version__)
defpinjie():
top,bot,left,right=100,100,0,500
img1=cv.imread('G:/2018and2019two/qianrushi/wuluo1.png')
cv.imshow("img1",img1)
img2=cv.imread('G:/2018and2019two/qianrushi/wuluo2.png')
cv.imshow("img2",img2)
srcImg=cv.copyMakeBorder(
img1,top,bot,left,right,cv.BORDER_CONSTANT,value=(0,0,0))
testImg=cv.copyMakeBorder(
img2,top,bot,left,right,cv.BORDER_CONSTANT,value=(0,0,0))
img1gray=cv.cvtColor(srcImg,cv.COLOR_BGR2GRAY)
img2gray=cv.cvtColor(testImg,cv.COLOR_BGR2GRAY)
sift=cv.xfeatures2d_SIFT().create()
#findthekeypointsanddescriptorswithSIFT
kp1,des1=sift.detectAndCompute(img1gray,None)
kp2,des2=sift.detectAndCompute(img2gray,None)
#FLANNparameters
FLANN_INDEX_KDTREE=1
index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)
search_params=dict(checks=50)
flann=cv.FlannBasedMatcher(index_params,search_params)
matches=flann.knnMatch(des1,des2,k=2)
#Needtodrawonlygoodmatches,socreateamask
matchesMask=[[0,0]foriinrange(len(matches))]
good=[]
pts1=[]
pts2=[]
#ratiotestasperLowe'spaper
fori,(m,n)inenumerate(matches):
ifm.distance<0.7*n.distance:
good.append(m)
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
matchesMask[i]=[1,0]
draw_params=dict(matchColor=(0,255,0),
singlePointColor=(255,0,0),
matchesMask=matchesMask,
flags=0)
img3=cv.drawMatchesKnn(img1gray,kp1,img2gray,
kp2,matches,None,**draw_params)
#plt.imshow(img3,),plt.show()
rows,cols=srcImg.shape[:2]
MIN_MATCH_COUNT=10
iflen(good)>MIN_MATCH_COUNT:
src_pts=np.float32(
[kp1[m.queryIdx].ptformingood]).reshape(-1,1,2)
dst_pts=np.float32(
[kp2[m.trainIdx].ptformingood]).reshape(-1,1,2)
M,mask=cv.findHomography(src_pts,dst_pts,cv.RANSAC,5.0)
warpImg=cv.warpPerspective(testImg,np.array(
M),(testImg.shape[1],testImg.shape[0]),flags=cv.WARP_INVERSE_MAP)
forcolinrange(0,cols):
ifsrcImg[:,col].any()andwarpImg[:,col].any():
left=col
break
forcolinrange(cols-1,0,-1):
ifsrcImg[:,col].any()andwarpImg[:,col].any():
right=col
break
res=np.zeros([rows,cols,3],np.uint8)
forrowinrange(0,rows):
forcolinrange(0,cols):
ifnotsrcImg[row,col].any():
res[row,col]=warpImg[row,col]
elifnotwarpImg[row,col].any():
res[row,col]=srcImg[row,col]
else:
srcImgLen=float(abs(col-left))
testImgLen=float(abs(col-right))
alpha=srcImgLen/(srcImgLen+testImgLen)
res[row,col]=np.clip(
srcImg[row,col]*(1-alpha)+warpImg[row,col]*alpha,0,255)
#opencvisbgr,matplotlibisrgb
res=cv.cvtColor(res,cv.COLOR_BGR2RGB)
#showtheresult
plt.figure()
plt.imshow(res)
plt.show()
else:
print("Notenoughmatchesarefound-{}/{}".format(len(good),MIN_MATCH_COUNT))
matchesMask=None
if__name__=="__main__":
pinjie()
3、运行效果
原始的两张图:
效果图:
原始图,水杯没有处理好,导致此处效果不好。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。