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


Posted in Python onMarch 05, 2020

本文实例为大家分享了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如何将两张图片生成为全景图片

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
python3获取url文件大小示例代码
Sep 18 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python数据爬下来保存的位置
Feb 17 Python
Django models文件模型变更错误解决
May 11 Python
python如何写个俄罗斯方块
Nov 06 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
浅谈Python 中的复数问题
May 19 Python
Python编程super应用场景及示例解析
Oct 05 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
Python 定义只读属性的实现方式
Mar 05 #Python
Pycharm中import torch报错的快速解决方法
Mar 05 #Python
Python中私有属性的定义方式
Mar 05 #Python
Python实现AI自动抠图实例解析
Mar 05 #Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 #Python
Python matplotlib修改默认字体的操作
Mar 05 #Python
Django 返回json数据的实现示例
Mar 05 #Python
You might like
php动态添加url查询参数的方法
2015/04/14 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
vue添加class样式实例讲解
2019/02/12 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
详解 Python 读写XML文件的实例
2017/08/02 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
电子商务专业自我鉴定
2013/12/18 职场文书
布达拉宫的导游词
2015/02/02 职场文书
个人工作表现自我评价
2015/03/06 职场文书
采购员岗位职责范本
2015/04/07 职场文书
汉字听写大会观后感
2015/06/12 职场文书
特种设备安全管理制度
2015/08/06 职场文书
Win10 Anaconda安装python-pcl
2022/04/29 Servers