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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python兔子毒药问题实例分析
Mar 05 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 Python
Python学习笔记之For循环用法详解
Aug 14 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
Python Gitlab Api 使用方法
Aug 28 Python
python修改文件内容的3种方法详解
Nov 15 Python
python集成开发环境配置(pycharm)
Feb 14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
基于JQuery的多标签实现代码
2012/09/19 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
Python中防止sql注入的方法详解
2017/02/25 Python
Python实现的科学计算器功能示例
2017/08/04 Python
详解python字节码
2018/02/07 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
Python如何进行时间处理
2020/08/06 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
汽车销售求职自荐信
2013/10/01 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
中职生自荐信范文
2014/06/15 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
javascript函数式编程基础
2021/09/15 Javascript