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 01 Python
Python中正则表达式的用法实例汇总
Aug 18 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
python实现QQ批量登录功能
Jun 19 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
Python之字典对象的几种创建方法
Sep 30 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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批量生成缩略图的代码
2008/07/19 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
javascript 写类方式之九
2009/07/05 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
常用DOM整理
2015/06/16 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
Python文件读取的3种方法及路径转义
2015/06/21 Python
详解Python字符串对象的实现
2015/12/24 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
校园环保广播稿(3篇)
2014/09/15 职场文书
离婚财产分配协议书
2014/10/21 职场文书
功夫熊猫观后感
2015/06/10 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis