淺論3DGS濺射模型在VR眼鏡上的應用

擺爛仙君小課堂開課了,本期將介紹如何手搓VR眼鏡,并將隨手拍的電影變成3D視頻。

一、3DGS模型介紹

3D 高斯模型是基于高斯函數構建的用于描述三維空間中數據分布概率的模型,高斯函數在數學和物理領域有著廣泛應用,其在 3D 情境下的拓展為我們理解和處理三維數據提供了強大工具。在三維空間中,高斯模型的概率密度函數形式較為復雜,涉及多個參數。中心點坐標 (μ_x, μ_y, μ_z) 決定了分布的中心位置,即數據最可能聚集的點。而協方差矩陣則描述了數據在各個方向上的分布范圍和相關性。協方差矩陣是一個對稱的 3×3 矩陣,其對角線元素 (σ_x2, σ_y2, σ_z2) 分別代表數據在 x、y、z 軸上的方差,方差越大,說明數據在該軸方向上的分散程度越高;非對角線元素 σ_xy、σ_xz、σ_yz 反映了不同坐標軸之間的協方差,衡量了兩個變量之間的線性相關程度,比如 σ_xy 為正,表明 x 和 y 方向的數據變化呈正相關趨勢。

該模型在諸多領域都有重要應用,其中最重要的就是可以惡搞自己的室友,如圖。

但是我們本期要講的是如何通過3D濺射模型把普通視頻變成3D視頻。

二、VR眼鏡盒子

VR眼鏡盒子是一種較為基礎且便捷的虛擬現實設備。其外觀通常小巧輕便,便于攜帶和使用,主體部分多為一個類似眼鏡的框架結構,中間有可容納顯示屏的區域,兩側設有綁帶或夾子等固定裝置,用于將設備穩固地佩戴在頭上,確保使用者在使用過程中不會輕易滑落或移位。它的工作原理在于借助智能手機等具備顯示功能的設備來作為顯示屏,將手機放入盒子中特定的位置后,通過盒子內部的光學鏡片等元器件對手機屏幕上的畫面進行放大和聚焦,營造出一種身臨其境的立體視覺效果。當使用者轉動頭部時,借助手機內部的陀螺儀等傳感器,可實時感知頭部的運動方向和角度變化,并將這些信息反饋給正在運行的VR應用,從而使得畫面能夠相應地進行切換或調整,讓使用者仿佛置身于一個全方位、沉浸式的虛擬場景之中,無論是觀看3D電影、體驗虛擬旅游還是進行一些簡單的VR游戲,都能提供較為出色的沉浸感體驗。不過,由于其成本相對較低,技術也較為基礎,在畫面的清晰度、視場角以及幀率等方面可能不如一些高端的VR頭顯設備,但其親民的價格和便捷的操作方式使其在普通消費者群體中有著較為廣泛的應用,為大眾接觸和體驗虛擬現實技術提供了一個入門級的便捷選擇。

假設透鏡的焦距為f,透鏡與顯示屏之間的距離為d,顯示屏上的圖像高度為h,經過透鏡放大后的像高度為H。根據透鏡成像公式:

f1?=u1?+v1?

其中,u 為物體到透鏡的距離(即顯示屏到透鏡的距離),v 為像到透鏡的距離。對于VR眼鏡盒子來說,透鏡通常被設計為靠近顯示屏的一側,因此 u 是一個較小的正值。根據成像公式,可以求出像距 v。

像的放大率 M 可以表示為:

M=hH?=uv?

通過調整透鏡的焦距 f 和物體距 u,可以控制像的放大率和成像位置,從而優化用戶的視覺體驗。VR眼鏡盒子利用雙眼視覺和視差原理來營造三維立體效果。人類的雙眼分別位于頭部的兩側,兩眼之間的距離(稱為瞳距)導致兩眼看到的物體圖像存在細微差異,這種差異稱為視差。大腦通過對兩眼圖像的融合和處理,能夠感知物體的深度和立體感。在VR眼鏡盒子中,左右兩個透鏡分別將兩幅略有差異的圖像(通常由VR應用生成)投射到用戶的左右眼中,模擬了人眼觀察真實世界時的視差效果。這種視差信息被大腦處理后,用戶就會感受到虛擬場景的深度和立體感。

三、博主的實操記錄

1.手搓VR眼鏡

VR眼鏡的技術原理在之前已經講的很清楚了,無非就是雙目視差罷了,所以實現起來也很簡單,找個空紙殼然后折疊成下圖這個樣子,然后放上兩個放大鏡片就好了,是不是有手就行。

什么?說沒有放大鏡片,沒事兒,仙君教你:在塑料瓶的上半部分中裁出兩個圓片,然后將這兩個圓片用膠水粘起來,里面放滿水,一個放大鏡片這不就做出來了嗎?還不會的同學就自己上網買一個吧,也就十來塊的樣子,沒錢的可以在評論區找博主報銷。

2.普通視頻轉成VR視頻

這種VR視頻比較普通,就是將一個視頻變成兩個分視角的圖片,多的不說,上干貨:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 加載預訓練的深度估計模型和相關文件
def load_depth_model():# 模型和配置文件路徑(假設已下載對應的模型文件)model_path = "models/midas_v2_1_small.onnx"# 加載模型depth_model = cv.dnn.readNet(model_path)return depth_model# 深度估計函數
def estimate_depth(frame, depth_model):# 將圖片轉換為模型需要的格式img = cv.cvtColor(frame, cv.COLOR_BGR2RGB)img = cv.resize(img, (256, 256), interpolation=cv.INTER_AREA)# 創建blobblob = cv.dnn.blobFromImage(img, 1/255., (256, 256), (123.675, 116.28, 103.53), swapRB=True, crop=False)# 設置輸入并前向傳播depth_model.setInput(blob)depth_map = depth_model.forward()depth_map = depth_map.reshape((256, 256))# 歸一化深度圖depth_map = cv.normalize(depth_map, None, 0, 1, cv.NORM_MINMAX)return depth_map# 根據深度圖計算視差圖
def compute_disparity(depth_map, max_disparity=50):# 計算視差圖,簡單的將深度圖轉換為視差圖# 實際應用中可能需要更復雜的計算disparity_map = (1.0 - depth_map) * max_disparityreturn disparity_map.astype(np.int32)# 根據視差圖生成右視圖
def generate_right_view(left_view, disparity_map):height, width = left_view.shape[:2]# 將視差圖擴展到與圖像相同的尺寸disparity_map_img = cv.resize(disparity_map, (width, height), interpolation=cv.INTER_NEAREST)# 創建右視圖right_view = np.zeros_like(left_view)# 沿x軸移動每個像素,根據視差圖的值(簡單的水平位移)for y in range(height):for x in range(width):disp = disparity_map_img[y, x]new_x = x - dispif new_x >= 0 and new_x < width:right_view[y, new_x] = left_view[y, x]else:# 處理邊界情況,使用原圖的邊緣像素填充if new_x < 0:right_view[y, 0] = left_view[y, x]elif new_x >= width:right_view[y, width - 1] = left_view[y, x]return right_view# 讀取視頻文件
input_video_path = 'input_video.mp4'
output_video_path = 'output_3d_video.mp4'# 打開視頻文件
cap = cv.VideoCapture(input_video_path)
if not cap.isOpened():print("Error: Could not open video.")exit()# 獲取視頻屬性
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)# 定義視頻輸出
fourcc = cv.VideoWriter_fourcc(*'MP4V')
out = cv.VideoWriter(output_video_path, fourcc, fps, (frame_width * 2, frame_height))# 加載深度估計模型
depth_model = load_depth_model()# 處理視頻的每一幀
while cap.isOpened():ret, frame = cap.read()if not ret:break# 估計深度depth_map = estimate_depth(frame, depth_model)# 計算視差圖disparity_map = compute_disparity(depth_map)# 生成右視圖right_view = generate_right_view(frame, disparity_map)# 創建左右分屏的3D視頻幀stereo_frame = cv.hconcat([frame, right_view])# 寫入輸出視頻文件out.write(stereo_frame)# 顯示處理后的幀(可選)cv.imshow('3D Video', cv.resize(stereo_frame, (frame_width * 2 // 2, frame_height // 2)))# 按'q'鍵退出循環if cv.waitKey(1) & 0xFF == ord('q'):break# 釋放資源
cap.release()
out.release()
cv.destroyAllWindows()

以上代碼使用深度估計模型來估計每一幀圖像的深度,然后根據深度圖計算視差圖,最后根據視差圖生成右視圖。需要注意的是,這種方法的效果可能不是非常好,實際應用中可能需要更復雜的視差計算方法,例如使用立體匹配算法等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82963.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年中期大語言模型實力深度剖析

I. 引言&#xff1a;解讀2025年動態LLM競技場中的“實力” 用戶提出的“如今哪個大語言模型最強”這一問題&#xff0c;精準地反映了業界對飛速發展的人工智能&#xff08;AI&#xff09;領域的高度關注。本報告基于截至2025年5月的最新數據&#xff0c;旨在對這一問題進行全面…

Spark緩存-cache

一、RDD持久化 1.什么時候該使用持久化&#xff08;緩存&#xff09; 2. RDD cache & persist 緩存 3. RDD CheckPoint 檢查點 4. cache & persist & checkpoint 的特點和區別 特點 區別 二、cache & persist 的持久化級別及策略選擇 Spark的幾種持久化…

嵌入式開發學習日志(數據結構--順序結構單鏈表)Day19

一、順序結構 安裝軟件命令&#xff1a; sudo apt-get install (軟件名) 安裝格式化對齊&#xff1a;sudo apt-get install clang-format 內存泄漏檢測工具&#xff1a; sudo apt-get install valgrind 編譯后&#xff0c;使用命令 valgrind ./a.out 即可看內…

第六節第二部分:抽象類的應用-模板方法設計模式

模板方法設計模式的寫法 建議使用final關鍵字修飾模板方法 總結 代碼&#xff1a; People(父類抽象類) package com.Abstract3; public abstract class People {/*設計模板方法設計模式* 1.定義一個模板方法出來*/public final void write(){System.out.println("\t\t\t…

2025年滲透測試面試題總結-滲透測試紅隊面試三(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 滲透測試紅隊面試三 六十一、主機被入侵自查解決方案 六十二、NAT&#xff08;網絡地址轉換&#xff…

springboot-web基礎

21.web spring MVC 基于瀏覽器的 B/S 結構應用十分流行。Spring Boot 非常適合 Web 應用開發。可以使用嵌入式 Tomcat、Jetty、 Undertow 或 Netty 創建一個自包含的 HTTP 服務器。一個 Spring Boot 的 Web 應用能夠自己獨立運行&#xff0c;不依賴需 要安裝的 Tomcat&#x…

重構Cursor無限電子郵箱注冊系統的技術實踐

引言 在當今數字化時代&#xff0c;電子郵箱已成為個人和企業網絡身份的基礎。作為開發者&#xff0c;我們往往會遇到需要設計注冊系統的場景&#xff0c;而如何構建一個既安全又用戶友好的郵箱注冊系統&#xff0c;是值得深入探討的話題。本文將圍繞Cursor郵箱系統的技術重構…

2025.05.10京東機考真題算法崗-第三題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 忍者屋頂之旅 問題描述 LYA是一位身手敏捷的忍者,正在一個古老的村莊進行飛檐走壁的訓練。村莊有兩排房屋,每排從左到右排列著 n n

vscode不能跳轉到同一個工作區的其他文件夾

明白了&#xff0c;你說的“第二種情況”是指&#xff1a; 你先打開的是項目文件夾&#xff08;比如 MyProject&#xff09;&#xff0c;然后通過 VS Code 的“添加文件夾到工作區”功能&#xff0c;把 ThirdPartyLib 文件夾添加進來。 結果&#xff0c;項目代碼里 #include “…

FastAPI 和 MongoDB 實現請求頭參數處理的示例,并在 React 中進行渲染

FastAPI 和 MongoDB 后端 安裝必要的庫 安裝 FastAPI、Uvicorn、Motor&#xff08;用于 MongoDB 的異步驅動&#xff09;和 Pydantic&#xff08;用于數據驗證&#xff09;。 pip install fastapi uvicorn motor pydantic創建 FastAPI 應用 創建一個文件 main.py&#xff0c;并…

技術倫理雙軌認證如何重構AI工程師能力評估體系——基于AAIA框架的技術解析與行業實證研究

引言&#xff1a;AI工程師能力評估的范式轉型 2025年全球人工智能產業呈現出兩大特征&#xff1a;技術迭代加速與監管框架完善。據Gartner數據顯示&#xff0c;全球75%的企業在AI項目部署中遭遇技術倫理混合型難題&#xff0c;傳統單維度技術認證體系已無法滿足產業需求。本文…

03.Golang 切片(slice)源碼分析(二、append實現)

Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;二、append實現&#xff09; 前言&#xff1a; Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;一、定義與基礎操作實現&#xff09; 在前面的文章我們介紹了&#xff0c;切片的結構體與創建\擴容…

mysql常用方法

mysql常用方法 一、基本用法 -- MySQL創建唯一索引 CREATE UNIQUE INDEX 索引名 ON 表名(列名1,列名2,...); --也可以使用ALTER TABLE語句給現有表添加唯一索引&#xff08;UNIQUE&#xff09; ALTER TABLE 表名 ADD CONSTRAINT 索引名 UNIQUE KEY(列名1,列名2,...); alter t…

STM32F103C8T6板子使用說明

第一章 計算機體系結構(了解) 后續在板子上開發的時候&#xff0c;需要考慮是否有操作系統 方式一&#xff1a;有操作系統&#xff0c;通過c庫通過os api操作硬件方式二&#xff1a;無操作系統&#xff0c; 通過c庫通過固件庫操作硬件 第二章 STM32開發板概述 板子/開發板&…

PBR材質-Unity/Blender/UE

目錄 前言&#xff1a; 一、Unity&#xff1a; 二、Blender&#xff1a; 三、UE&#xff1a; 四、全家福&#xff1a; 五、后記&#xff1a; 前言&#xff1a; PBR流程作為表達物理效果的經典方式&#xff0c;很值得一學。紋理貼圖使用的是上一期的Textures | cgbookcas…

【生產實踐】Linux中/usr/bin、/usr/sbin與/usr/local的關系解析(2025年技術規范)

一、核心定位與功能劃分 /usr/bin&#xff1a;用戶級通用命令庫 ? 定位&#xff1a;存儲系統預裝的用戶級可執行文件&#xff0c;這些命令通常由Linux發行版官方軟件包管理器&#xff08;如APT、YUM&#xff09;安裝&#xff0c;屬于系統默認功能的一部分。 ? 示例命令&#…

智能網聯汽車 “中央計算” 博弈:RTOS 與跨域融合的算力分配挑戰

一、引言 隨著智能駕駛技術的飛速發展&#xff0c;汽車逐漸從傳統的交通工具演變為移動的智能終端。智能網聯汽車的核心競爭力日益體現在其強大的計算能力和高效的算力管理上。汽車電子電氣架構&#xff08;EEA&#xff09;正經歷從分布式架構向 “中央計算 區域控制” 架構的…

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目錄 [TOC](文章目錄) 前言一、添加保護加密口令二、添加水印三、實驗四、參考文章總結 實驗工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、添加保護加…

python面試實戰經驗分享

2025/3/28第一面 杭州實在智能 見習python開發工程師 1、Python方法中參數默認值可以是列表或者字典嗎? 在Python中,函數參數的默認值可以是列表或字典,列表或者字典在初始化應在函數體內,如果不正確處理,可能會導致所有調用都共享同一個列表。 2、協程、線性和進程 進程…

MIST:一鍵解鎖 macOS 歷史版本,舊系統安裝不再難!

在 Mac 電腦的使用過程中&#xff0c;你是否遇到過這些困擾&#xff1f;為了運行一款經典設計軟件&#xff0c;新系統卻無法兼容&#xff1b;或是想給老舊 Mac 設備升級&#xff0c;卻找不到適配的系統版本。而 App Store 里&#xff0c;舊版 macOS 安裝包就像 “隱藏副本”&am…