小案例:编写立方体六个面,合成一张全景图后端
一、需求:
- 给出立方体六个面,合成一张全景图
二、主要知识:py360convert
2.1、该项目的特点:
- 立方体贴图和等矩形之间的转换
- 等角于平面
- 纯python实现,仅依赖于numpy和scipy
- 矢量化实施(在大多数地方)
c2e
e2c
在1.6 GHz Intel Core i5 CPU上花费300ms并花费160ms
2.2、安装
pip install py360convert
现在,您可以在任何地方import py360convert
或使用命令行工具convert360
。
2.3、参数:
e2c(e_img, face_w=256, mode='bilinear', cube_format='dice')
将给定的等矩形转换为立方体贴图。
参数:
e_img
:形状为[H,W,C]的块状数组。face_w
:每个立方体面的宽度。mode
:bilinear
或nearest
。cube_format
:请参阅c2e
说明。
e2p(e_img, fov_deg, u_deg, v_deg, out_hw, in_rot_deg=0, mode='bilinear')
从给定的等角线拍摄透视图。 参数:
e_img
:形状为[H,W,C]的块状数组。fov_deg
:以int或tuple给出的视野(h_fov_deg, v_fov_deg)
。u_deg
:水平视角在[-pi,pi]范围内。(-左/ +右)。v_deg
:垂直视角,范围为[-pi / 2,pi / 2]。(-向下/ +向上)。out_hw
:(height, width)
以元组输出图像。in_rot_deg
:平面内旋转。mode
:bilinear
或nearest
。
三、示例:
3.1、立方体六个面:
背面(b):
前面(f):
左面(l):
右面(r):
上面(u):
下面(d):
3.2、合成全景图效果:
三、编辑后端代码:
import uuid
import os
import py360convert
from django.core.files.storage import default_storage
from django.http import JsonResponse
import cv2# Create your views here.def image_transpose(req):if req.method == 'POST':# 给图片唯一标识uuid0 = str(uuid.uuid1())# 获取图片信息,六个面依次为:前、后、左、右、上、下front_image = req.FILES.get("front_image", None)backward_image = req.FILES.get("backward_image", None)left_image = req.FILES.get("left_image", None)right_image = req.FILES.get("right_image", None)top_image = req.FILES.get("top_image", None)bottom_image = req.FILES.get("bottom_image", None)quality_para = req.POST.get("quality", None)target_size_w = req.POST.get("size", None)# 获取图片宽度if not target_size_w:target_size_w = 3000if target_size_w is not None:target_size_w = int(target_size_w)target_size_h = int(target_size_w // 2)# 控制图片清晰度if not quality_para:quality_para = 3quality_map = {0: 40,1: 60,2: 90}quality_para = int(quality_para)quality_save = quality_map.get(quality_para, None)if quality_save is None:quality_save = 70os.mkdir('./static/trans' + uuid0)out_path = 'static/' + uuid0# 合成全景图if front_image and backward_image and left_image and right_image and top_image and bottom_image:default_storage.save(os.path.join('static/trans/', uuid0, 'front_image.jpg'),front_image)default_storage.save(os.path.join('static/trans/', uuid0, 'backward_image.jpg'),backward_image)default_storage.save(os.path.join('static/trans/', uuid0, 'left_image.jpg'),left_image)default_storage.save(os.path.join('static/trans/', uuid0, 'right_image.jpg'),right_image)default_storage.save(os.path.join('static/trans/', uuid0, 'top_image.jpg'),top_image)default_storage.save(os.path.join('static/trans/', uuid0, 'bottom_image.jpg'),bottom_image)cube_dice0 = cv2.imread(os.path.join('static/trans/', uuid0, 'front_image.jpg'))cube_dice1 = cv2.imread(os.path.join('static/trans/', uuid0, 'right_image.jpg'))cube_dice2 = cv2.imread(os.path.join('static/trans/', uuid0, 'backward_image.jpg'))cube_dice3 = cv2.imread(os.path.join('static/trans/', uuid0, 'left_image.jpg'))cube_dice4 = cv2.imread(os.path.join('static/trans/', uuid0, 'top_image.jpg'))cube_dice5 = cv2.imread(os.path.join('static/trans/', uuid0, 'bottom_image.jpg'))cube_dice1 = cv2.flip(cube_dice1, 1)cube_dice2 = cv2.flip(cube_dice2, 1)cube_dice4 = cv2.flip(cube_dice4, 0)res = py360convert.c2e([cube_dice0, cube_dice1, cube_dice2, cube_dice3, cube_dice4,cube_dice5], target_size_h, target_size_w, cube_format='list')cv2.imwrite(os.path.join('static/trans/', uuid0, 'panorama.jpg'),res, [int(cv2.IMWRITE_JPEG_QUALITY), quality_save])# 保存图片:第一种方式,自己配置下载到相应的地方;第二种下载到本地return JsonResponse({"error": 0,"message": "no error",# 这里下载图片,目前采用自己配置的环境"result": {"panorama": 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' + uuid0 + '/panorama.jpg'}})else:return JsonResponse({"error": 1,"message": "Saving files error!","result": {}})else:return JsonResponse({"error": 1,"message": "method error","result": {}})
小案例:编写立方体六个面,合成一张全景图后端相关推荐
- 使用idea编写SparkStreaming消费kafka中的数据,并对数据进行某一指标的处理【小案例】(五)
接 使用idea编写SparkStreaming消费kafka中的数据[小案例](四) https://georgedage.blog.csdn.net/article/details/1035 ...
- 使用idea编写SparkStreaming消费kafka中的数据【小案例】(四)
继续接 使用idea编写消费者,接收生产者的持续日志输出[小案例](三) https://georgedage.blog.csdn.net/article/details/103506165 ...
- 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)
在 用idea编写代码作为生产者,Kafka接收其[持续]发来的广告日志信息[小案例](二) https://georgedage.blog.csdn.net/article/details/10 ...
- 用idea编写代码作为生产者,Kafka接收其【持续】发来的广告日志信息【小案例】(二)
接我们上一篇使用idea编写代码作为生产者,Kafka接收其发来的信息[小案例](一) https://georgedage.blog.csdn.net/article/details/1035034 ...
- Python小案例(六)通过熵权法计算指标权重
Python小案例(六)通过熵权法计算指标权重 在日常业务中,产品运营需要综合多个指标进行判断,如果没有目标变量进行监督训练的话,很难人为地判断哪个指标更好,综合起来哪个类别更优秀. 这里介绍一种基于 ...
- 使用idea编写代码作为生产者,Kafka接收其发来的信息【小案例】(一)
对于这个小案例,简单来个图示, 友情补充pom <dependencies><dependency><groupId>org.apache.spark</gr ...
- 敏态下“骨架化、模块化”测试案例编写技术实践
文/叶婷婷 罗章坤 一.引言 随着互联网金融监管的日益严格.市场竞争的不断加剧及客户需求的快速变化,金融企业IT系统的复杂程度不断提高,IT需求日益放大,创新型需求持续产生.传统的软件开发模式,诸如瀑 ...
- JQuery的几个简单小案例(基础)
JQuery的几个简单小案例 实现表格的的隔行换色 实现复选框的全选与全不选 QQ表情的选择 多选下拉列表的左右移动 实现表格的的隔行换色 需求:事先制作一个如图所示的table表格,将数据行的奇数行 ...
- web分页显示功能(“小案例:实现web端对客户资源的增删改查”里面的一个功能)
分页显示功能("小案例:实现web端对客户资源的增删改查"里面的一个功能) (2016年11月19日18:15:07 上课学习总结) 效果展示: 第n页/共M页 首页 上一页 ...
最新文章
- 造成机器学习项目失败的7个原因
- android 服务器异步回调,android – 如何从异步任务返回结果
- [Spring入门学习笔记][静态资源]
- Pokémon Go数据收集是否带来隐私问题
- [BZOJ1833][ZJOI2010]Count数字计数(DP)
- (王道408考研数据结构)第五章树-第四节4:红黑树基本概念及操作
- ADO.NET编程(4)根据条件查询DataTable的值
- jQuery加载js脚本
- 光流(五)--HS光流及稠密光流
- vbs整人代码蓝屏_vbs整人程序大全
- uniapp:微信小程序地图功能
- 软件智能:aaas系统的 AI服务功能:大纲图的无意识代理功能和八卦图的关系
- CentOS7系统清理缓存数据命令
- 软件开发七宗罪(转)
- 谷歌浏览器崩溃解决办法
- python如何获取列表的长度
- snmp 获得硬件信息_网络管理员之软硬件安装
- 模型转换、模型压缩、模型加速工具汇总
- 数字系统实验:三位数码管
- 2D(横版)游戏开发心得
热门文章
- source insight怎样恢复默认界面设置
- Day 02 第二天课时总结
- Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
- bzoj 1058: [ZJOI2007]报表统计
- MYSQL基础十一--存储引擎
- 【转】【Linux】linux awk命令详解
- bzoj1053: [HAOI2007]反素数ant
- [设计模式]6. C++与职责链模式(chain of rsponsibility pattern)
- CentOS 7 gedit编辑器中文乱码解决方法
- hoj2677 Instruction Set // poj3253Fence Repair 哈夫曼树