小案例:编写立方体六个面,合成一张全景图后端
生活随笔
收集整理的這篇文章主要介紹了
小案例:编写立方体六个面,合成一张全景图后端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、需求:
- 給出立方體六個面,合成一張全景圖
二、主要知識:py360convert
2.1、該項目的特點:
- 立方體貼圖和等矩形之間的轉換
-
?
- 等角于平面
-
?
- 純python實現,僅依賴于numpy和scipy
- 矢量化實施(在大多數地方)
- c2ee2c在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說明。
從給定的等角線拍攝透視圖。?參數:
- 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": {}})?
總結
以上是生活随笔為你收集整理的小案例:编写立方体六个面,合成一张全景图后端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的类属性和实例属性
- 下一篇: 爱斯基摩结构