python如何将两张图片生成为全景图片

作者:无落 时间:2021-08-03 23:42:26 

本文实例为大家分享了python将两张图片生成全景图片的具体代码,供大家参考,具体内容如下

1、全景图片的介绍

全景图通过广角的表现手段以及绘画、相片、视频、三维模型等形式,尽可能多表现出周围的环境。360全景,即通过对专业相机捕捉整个场景的图像信息或者使用建模软件渲染过后的图片,使用软件进行图片拼合,并用专门的播放器进行播放,即将平面照片或者计算机建模图片变为360 度全观,用于虚拟现实浏览,把二维的平面图模拟成真实的三维空间,呈现给观赏者。

2、如何实现

2.1、实现原理

主要是利用sift的特征提取与匹配,参考链接

2.2、实现代码


# -*- coding:utf-8 -*-
u'''
Created on 2019年6月14日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-06-14'
import numpy as np
import cv2 as cv
from PIL import Image
from matplotlib import pyplot as plt
print('cv version: ', cv.__version__)

def pinjie():
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()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1gray, None)
kp2, des2 = sift.detectAndCompute(img2gray, None)
# FLANN parameters
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)

# Need to draw only good matches, so create a mask
matchesMask = [[0, 0] for i in range(len(matches))]

good = []
pts1 = []
pts2 = []
# ratio test as per Lowe's paper
for i, (m, n) in enumerate(matches):
 if m.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
if len(good) > MIN_MATCH_COUNT:
 src_pts = np.float32(
  [kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
 dst_pts = np.float32(
  [kp2[m.trainIdx].pt for m in good]).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)

for col in range(0, cols):
  if srcImg[:, col].any() and warpImg[:, col].any():
   left = col
   break
 for col in range(cols - 1, 0, -1):
  if srcImg[:, col].any() and warpImg[:, col].any():
   right = col
   break

res = np.zeros([rows, cols, 3], np.uint8)
 for row in range(0, rows):
  for col in range(0, cols):
   if not srcImg[row, col].any():
    res[row, col] = warpImg[row, col]
   elif not warpImg[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)

# opencv is bgr, matplotlib is rgb
 res = cv.cvtColor(res, cv.COLOR_BGR2RGB)
 # show the result
 plt.figure()
 plt.imshow(res)
 plt.show()
else:
 print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT))
 matchesMask = None

if __name__ == "__main__":
pinjie()

3、运行效果

原始的两张图:

python如何将两张图片生成为全景图片

效果图:

python如何将两张图片生成为全景图片

原始图,水杯没有处理好,导致此处效果不好。

来源:https://blog.csdn.net/qq_43433255/article/details/92211849

标签:python,全景图片
0
投稿

猜你喜欢

  • PHP+redis实现添加处理投票的方法

    2023-11-22 04:38:19
  • 奇淫技巧之图片切割

    2010-09-21 13:24:00
  • python 详解如何使用GPU大幅提高效率

    2023-08-24 19:45:46
  • matplotlib绘图实例演示标记路径

    2021-10-18 08:51:04
  • php查找指定目录下指定大小文件的方法

    2023-09-03 17:53:36
  • Python遍历文件夹和读写文件的实现代码

    2023-07-28 12:13:10
  • JS如何获取变量值

    2008-05-18 12:52:00
  • Access为后台数据库的网站统计系统

    2008-11-16 17:34:00
  • python实现图片,视频人脸识别(opencv版)

    2023-03-14 12:41:07
  • 通过事务日志解决SQL Server常见四大故障(二)

    2009-03-25 13:51:00
  • Python浅析迭代器Iterator的使用

    2023-11-07 12:04:25
  • 在oracle 数据库查询的select 查询字段中关联其他表的方法

    2009-08-31 12:27:00
  • Python中文分词库jieba(结巴分词)详细使用介绍

    2023-03-17 10:31:35
  • Python调用钉钉自定义机器人的实现

    2023-08-29 20:08:55
  • window.open被浏览器拦截后的自定义提示

    2007-11-23 12:31:00
  • python单元测试框架pytest介绍

    2021-06-11 15:28:55
  • 在任意字符集下正常显示网页的方法一

    2023-10-12 05:20:46
  • CentOS 6.6服务器编译安装lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3)

    2023-11-15 06:40:50
  • CSS的学习应该注意学习方法

    2007-11-27 00:20:00
  • Python实现密钥密码(加解密)实例详解

    2022-09-10 12:03:37
  • asp之家 网络编程 m.aspxhome.com