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 正则式使用心得
May 07 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
python中的__slots__使用示例
Feb 26 Python
Python数据类型详解(四)字典:dict
May 12 Python
python下载图片实现方法(超简单)
Jul 21 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
浅谈Python type的使用
Nov 19 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 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
Yii操作数据库的3种方法
2014/03/11 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
[原创]图片分页查看
2006/08/28 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python二叉树的实现实例
2013/11/21 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Python常见异常分类与处理方法
2017/06/04 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
python求最大值最小值方法总结
2019/06/25 Python
python字符串反转的四种方法详解
2019/12/02 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
环卫工人先进事迹材料
2014/06/02 职场文书
音乐教师求职信
2014/06/28 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
2014年医生工作总结
2014/11/21 职场文书
个人租房协议书
2014/11/28 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android