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用来获得图片exif信息的库实例分析
Mar 16 Python
python读取oracle函数返回值
Jul 18 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
python图书管理系统
Apr 05 Python
python破解zip加密文件的方法
May 31 Python
python系列 文件操作的代码
Oct 06 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python如何建立全零数组
Jul 19 Python
python中编写函数并调用的知识点总结
Jan 13 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
详解Python中的进程和线程
Jun 23 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生成图形(Libchart)实例
2013/11/06 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php实现简单的上传进度条
2015/11/17 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python 调用DLL操作抄表机
2009/01/12 Python
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
一套软件测试笔试题
2014/07/25 面试题
元旦晚会邀请函
2014/02/01 职场文书
个人工作表现评语
2014/04/30 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
普宁寺导游词
2015/02/04 职场文书
音乐教师个人总结
2015/02/06 职场文书
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers