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 05 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
Python实现修改IE注册表功能示例
May 10 Python
Python检测网络延迟的代码
May 15 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python开发入门——set的使用
Sep 03 Python
python GUI计算器的实现
Oct 09 Python
Python 多进程原理及实现
Dec 21 Python
2021年最新用于图像处理的Python库总结
Jun 15 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
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python实现识别手写数字大纲
2018/01/29 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
Python Gitlab Api 使用方法
2019/08/28 Python
python实现的config文件读写功能示例
2019/09/24 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
单位创先争优活动方案
2014/01/26 职场文书
运动会通讯稿50字
2014/01/30 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
党风廉政承诺书
2014/03/27 职场文书
项目合作意向书范本
2014/04/01 职场文书
逃课检讨书范文
2015/05/06 职场文书
户外亲子活动总结
2015/05/08 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers