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对象引用、可变性和垃圾回收详解
Aug 21 Python
python中format()函数的简单使用教程
Mar 14 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
django 环境变量配置过程详解
Aug 06 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
python-xpath获取html文档的部分内容
Mar 06 Python
django实现模型字段动态choice的操作
Apr 01 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python 使用dict实现switch的操作
Apr 07 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如何抛出异常处理错误
2011/03/02 PHP
php的memcached客户端memcached
2011/06/14 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
详解vue路由
2020/08/05 Javascript
在Mac上删除自己安装的Python方法
2018/10/29 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
Python3 元组tuple入门基础
2020/02/09 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
关于Django Models CharField 参数说明
2020/03/31 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
员工自我鉴定
2013/10/09 职场文书
初中女生自我鉴定
2013/12/19 职场文书
公司授权委托书范本
2014/04/03 职场文书
在职证明书模板
2015/06/15 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS