基于cornerstone3D的dicom影像瀏覽器 第二十七章 設置vr相機,復位視圖

文章目錄

  • 前言
  • 一、VR視圖設置相機位置
    • 1. 相機位置參數
    • 2. 修改mprvr.js
    • 3. 調用流程
      • 1) 修改Toolbar3D.vue
      • 2) 修改View3d.vue
      • 3) 修改DisplayerArea3D.vue
  • 二、所有視圖復位
    • 1.復位流程說明
    • 2. 調用流程
      • 1) Toolbar3D中添加"復位"按鈕,發送reset事件
      • 2) View3d.vue中響應reset事件,調用DispalerArea3D中的reset函數
      • 3) DisplayerArea3D中添加并導出reset函數,增加setDefaultWindow函數
  • 總結


前言

  1. VR窗口通過設置相機顯示“前視( A )”、“后視( P )”、“左視( L )”、“右視( R )”、“俯視( S )”、“仰視( I )” 圖像
  2. 實現各視圖復位功能
    效果如下:
    在這里插入圖片描述

一、VR視圖設置相機位置

1. 相機位置參數

vtk坐標系,以人體為例:
x 軸正向: 從右至左 [1,0,0],反向:從左至右[-1,0,0]
y軸正向:從前至后[0,1,0],反向:從后至前[0,-1,0]
z軸正向:從下至上[0,0,1],反向:從上至下[0,0,-1]
相機的兩個參數:

  1. viewPlaneNormal,視平面法向量,與視線相反的方向。如相機對著物體拍攝,從物體指向相機鏡頭的方向就是視平面法向量。
  2. viewUp,相機向上的方向

于是可得以下參數:
前視( A ): viewPlaneNormal即為y軸反向[0, -1, 0],viewUp z軸正向[0,0,1]
后視( P ): viewPlaneNormal即為y軸正向[0, 1, 0],viewUp z軸正向[0,0,1]
左視( L ): viewPlaneNormal即為x軸正向[1, 0, 0],viewUp z軸正向[0,0,1]
右視( R ): viewPlaneNormal即為x軸反向[-1, 0, 0],viewUp z軸正向[0,0,1]
俯視( S ): viewPlaneNormal即為z軸正向[0, 0, 1],viewUp y軸正向[0,1,0]或反向[0,-1,0]
仰視( I ): viewPlaneNormal即為z軸反向[0, 0, -1],viewUp y軸反向[0,-1,0]

2. 修改mprvr.js

  1. 獲取viewport camera
  2. 設置camera兩個參數viewPlaneNormal、viewUp
  3. 調用viewport.resetCamera()應用生效
const cameraPos = {A: {viewPlaneNormal: [0, -1, 0],viewUp: [0, 0, 1]},P: {viewPlaneNormal: [0, 1, 0],viewUp: [0, 0, 1]},L: {viewPlaneNormal: [1, 0, 0],viewUp: [0, 0, 1]},R: {viewPlaneNormal: [-1, 0, 0],viewUp: [0, 0, 1]},S: {viewPlaneNormal: [0, 0, 1],viewUp: [0, 1, 0]},I: {viewPlaneNormal: [0, 0, -1],viewUp: [0, -1, 0]}
};export default class MPR {...setCameraPosition(position) {// 獲取相機位置參數const data = cameraPos[position];const viewport = this.renderingEngine.getViewport(idVolume);// 設置相機位置參數viewport.setCamera({viewUp: data.viewUp,viewPlaneNormal: data.viewPlaneNormal});viewport.resetCamera();}
}

3. 調用流程

1) 修改Toolbar3D.vue

  • 添加操作元素el-select
  • 綁定變量currentCameraPos
  • 監聽currentCameraPos變化,發送changeCameraPos事件
<script setup name="Toolbar3D">
const cameraPos = [{name:"前視(A)", value: "A"},{name:"后視(P)", value: "P"},{name:"左視(L)", value: "L"},{name:"右視(R)", value: "R"},{name:"俯視(S)", value: "S"},{name:"仰視(I)", value: "I"},
];
const currentCameraPos = ref("A");
watch(currentCameraPos, (newValue) => {emit("action", { name: "changeCameraPos", value: newValue });
});
</script>
<template>...<div class="toolbar-row"><div class="pre-label">Camera:</div><el-select v-model="currentCameraPos" placeholder="Select Camera Position" style="width: 200px"><el-option v-for="item in cameraPos" :key="item.value" :label="item.name" :value="item.value" /></el-select></div>
</template>

2) 修改View3d.vue

在OnToolbarAction中添加事件響應

async function OnToolbarAction(action) {...case "changeCameraPos":displayArea.value.setCameraPosition(action.value);break;
}

3) 修改DisplayerArea3D.vue

添加并導出函數setCameraPosition

const setCameraPosition = position => {theMPR.setCameraPosition(position);
};defineExpose({...setCameraPosition
});

二、所有視圖復位

1.復位流程說明

VR視圖:

  1. 圖像加載成功后保存相機初始參數
  2. 相機參數設置為初始參數
  3. 設置默認preset

切片視圖:
3. 調用viewport.resetCamera()
4. 設置默認窗寬窗位

修改mprvr.js,在loadImages函數中保存相機初始參數。增加resetCamera函數

const initVolumeCamera = {viewUp: [],viewPlaneNormal: [],position: [],focalPoint: [],viewAngle: 0,parallelScale: 1
};export default class MPR {...async loadImages(imageIds) {...this.renderingEngine.renderViewports(viewportIds);const viewport = this.renderingEngine.getViewport(idVolume);await setVolumesForViewports(this.renderingEngine, [{ volumeId }], [idVolume]).then(() => {viewport.setProperties({preset: "CT-Coronary-Arteries-2"});// 保存相機初始參數const camera = viewport.getCamera();initVolumeCamera.viewUp = camera.viewUp;initVolumeCamera.viewPlaneNormal = camera.viewPlaneNormal;initVolumeCamera.position = camera.position;initVolumeCamera.focalPoint = camera.focalPoint;initVolumeCamera.viewAngle = camera.viewAngle;initVolumeCamera.parallelScale = camera.parallelScale;});...}resetCamera() {if (!this.loaded) return;viewportIds.forEach(viewportId => {const viewport = this.renderingEngine.getViewport(viewportId);if (viewport) {if (viewportId === idVolume) { // VR視圖// 設置默認presetviewport.setProperties({preset: "CT-Coronary-Arteries-2"});// 設置初始相機參數const camera = viewport.getCamera();camera.viewUp = initVolumeCamera.viewUp;camera.viewPlaneNormal = initVolumeCamera.viewPlaneNormal;camera.position = initVolumeCamera.position;camera.focalPoint = initVolumeCamera.focalPoint;camera.viewAngle = initVolumeCamera.viewAngle;camera.parallelScale = initVolumeCamera.parallelScale;viewport.setCamera(camera);} else { // 切片視圖viewport.resetCamera();viewport.render();}}});}
}

2. 調用流程

1) Toolbar3D中添加"復位"按鈕,發送reset事件

2) View3d.vue中響應reset事件,調用DispalerArea3D中的reset函數

3) DisplayerArea3D中添加并導出reset函數,增加setDefaultWindow函數

// defWW, defWL在load函數中保存了默認窗值
const setDefaultWindow = () => {theMPR.setWindow(defWW.value, defWL.value);
};const reset = () => {theMPR.resetCamera();setDefaultWindow();
};defineExpose({...reset 
});

總結

1.講解VR視圖六個正向視圖的相機參數是如何設置的
2.VR視圖與切片視圖復位

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

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

相關文章

Opencv4 c++ 自用筆記 03 滑動條、相機與視頻操作

1. 相機與視頻操作 1.1 打開視頻&#xff0f;相機 OpenCV 中 imread() 只能讀取靜態圖像&#xff0c;若要讀取視頻文件或攝像頭流&#xff0c;需要使用 VideoCapture 類&#xff1a; // 構造函數 cv::VideoCapture::VideoCapture(); cv::VideoCapture…

身份證發給別人怎么加水印?賽文奧特曼身份證添加水印教程

我們經常需要使用身份證照片進行身份驗證、資料提交等操作。然而&#xff0c;直接將身份證照片發送給他人或上傳到網絡存在一定的信息泄露風險。為了更好地保護個人隱私&#xff0c;我們可以使用 簡鹿水印助手 這款工具&#xff0c;在身份證照片上添加專屬水印&#xff0c;從而…

十、【核心功能篇】項目與模塊管理:前端頁面開發與后端 API 聯調實戰

【核心功能篇】項目與模塊管理&#xff1a;前端頁面開發與后端 API 聯調實戰 前言準備工作第一部分&#xff1a;完善項目管理功能 (Project)1. 創建/編輯項目的表單對話框組件 第二部分&#xff1a;模塊管理功能 (集成到項目詳情頁)1. 創建模塊相關的 API 服務 (src/api/module…

ES分詞搜索

ES的使用 前言作者使用的版本作者需求 簡介ES簡略介紹ik分詞器簡介 使用es的直接簡單使用es的查詢 es在java中使用備注說明 前言 作者使用的版本 es: 7.17.27spring-boot-starter-data-elasticsearch: 7.14.2 作者需求 作者接到一個業務需求&#xff0c;我們系統有份數據被…

Axure設計案例——科技感立體柱狀圖

想讓你的數據展示告別平淡無奇&#xff0c;成為吸引全場目光的焦點嗎&#xff1f;快來瞧瞧這個Axure設計的科技感立體柱狀圖案例&#xff01;科技感設計風格借助逼真的立體效果打破傳統柱狀圖的平面感&#xff0c;營造出一種令人眼前一亮的視覺震撼。每一個柱狀體都仿佛是真實存…

惡意npm與VS Code包竊取數據及加密貨幣資產

60個npm包竊取系統敏感信息 安全研究人員在npm軟件包注冊表中發現60個惡意組件&#xff0c;這些組件能夠收集主機名、IP地址、DNS服務器和用戶目錄信息&#xff0c;并將其發送至Discord平臺控制的終端節點。據Socket安全研究員Kirill Boychenko上周發布的報告顯示&#xff0c;…

leetcode 2359. 找到離給定兩個節點最近的節點

給你一個 n 個節點的 有向圖 &#xff0c;節點編號為 0 到 n - 1 &#xff0c;每個節點 至多 有一條出邊。 有向圖用大小為 n 下標從 0 開始的數組 edges 表示&#xff0c;表示節點 i 有一條有向邊指向 edges[i] 。如果節點 i 沒有出邊&#xff0c;那么 edges[i] -1 。 同時…

1. pytorch手寫數字預測

1. pytorch手寫數字預測 1.背景2.準備數據集2.定義模型3.dataloader和訓練4.訓練模型5.測試模型6.保存模型 1.背景 因為自身的研究方向是多模態目標跟蹤&#xff0c;突然對其他的視覺方向產生了興趣&#xff0c;所以心血來潮的回到最經典的視覺任務手寫數字預測上來&#xff0…

AWS WebRTC:獲取ICE服務地址(part 2): ICE Agent的作用

上一篇&#xff0c;已經獲取到了ICE服務地址&#xff0c;從返回結果中看&#xff0c;是兩組TURN服務地址。 拿到這些地址有什么用呢&#xff1f;接下來就要說到WebRTC中ICE Agent的作用了&#xff0c;返回的服務地址會傳給WebRTC最終給到ICE Agent。 ICE Agent的作用&#xf…

大數據時代的利劍:Bright Data網頁抓取與自動化工具共建高效數據采集新生態

目錄 一、為何要選用Bright Data網頁自動化抓取——幫助我們高效高質解決以下問題&#xff01; 二、Bright Data網頁抓取工具 - 網頁爬蟲工具實測 2.1 首先注冊用戶 2.2 首先點擊 Proxies & Scraping &#xff0c;再點擊瀏覽器API的開始使用 2.3 填寫通道名稱&#xff…

指紋識別+精準化POC攻擊

開發目的 解決漏洞掃描器的痛點 第一就是掃描量太大&#xff0c;對一個站點掃描了大量的無用 POC&#xff0c;浪費時間 指紋識別后還需要根據對應的指紋去進行 payload 掃描&#xff0c;非常的麻煩 開發思路 我們的思路分為大體分為指紋POC掃描 所以思路大概從這幾個方面…

【Day40】

DAY 40 訓練和測試的規范寫法 知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#x…

【HTML-13】HTML表格合并技術詳解:打造專業數據展示

表格是HTML中展示結構化數據的重要元素&#xff0c;而表格合并則是提升表格表現力的關鍵技術。本文將全面介紹HTML中的表格合并方法&#xff0c;幫助您創建更專業、更靈活的數據展示界面。 1. 表格合并基礎概念 在HTML中&#xff0c;表格合并主要通過兩個屬性實現&#xff1a…

<uniapp><threejs>在uniapp中,怎么使用threejs來顯示3D圖形?

前言 本專欄是基于uniapp實現手機端各種小功能的程序,并且基于各種通訊協議如http、websocekt等,實現手機端作為客戶端(或者是手持機、PDA等),與服務端進行數據通訊的實例開發。 發文平臺 CSDN 環境配置 系統:windows 平臺:visual studio code、HBuilderX(uniapp開…

如何制作全景VR圖?

全景VR圖&#xff0c;特別是720度全景VR&#xff0c;為觀眾提供一種沉浸式體驗。 全景VR圖能夠捕捉場景的全貌&#xff0c;還能將多個角度的圖片或視頻無縫拼接成一個完整的全景視角&#xff0c;讓觀眾在虛擬環境中自由探索。隨著虛擬現實&#xff08;VR&#xff09;技術的飛速…

前端使用qrcode來生成二維碼的時候中間添加logo圖標

這個開源倉庫可以讓你在前端頁面中生成二維碼圖片&#xff0c;并且支持調整前景色和背景色&#xff0c;但是有個問題&#xff0c;就是不能添加logo圖片。issue&#xff1a; GitHub Where software is built 但是已經有解決方案了&#xff1a; add a logo picture Issue #21…

【C語言】函數指針及其應用

目錄 1.1 函數指針的概念和應用 1.2 賦值與內存模型 1.3 調用方式與注意事項 二、函數指針的使用 2.1 函數指針的定義和訪問 2.2 動態調度&#xff1a;用戶輸入驅動函數執行 2.3 函數指針數組進階應用 2.4 函數作為參數的高階抽象 三、回調函數 3.1 指針函數…

安裝flash-attention失敗的終極解決方案(WINDOWS環境)

想要看linux版本下安裝問題的請走這里&#xff1a;安裝flash-attention失敗的終極解決方案&#xff08;LINUX環境&#xff09; 其實&#xff0c;現在的flash-attention不像 v2.3.2之前的版本&#xff0c;基本上不兼容WINDOWS環境。但是在WINDOWS環境安裝總還是有那么一點不順暢…

[C]基礎16.數據在內存中的存儲

博客主頁&#xff1a;向不悔本篇專欄&#xff1a;[C]您的支持&#xff0c;是我的創作動力。 文章目錄 0、總結1、整數在內存中的存儲1.1 整數的二進制表示方法1.2 不同整數的表示方法1.3 內存中存儲的是補碼 2、大小端字節序和字節序判斷2.1 什么是大小端2.2 為什么有大小端2.3…

Python 基于卷積神經網絡手寫數字識別

Ubuntu系統&#xff1a;22.04 python版本&#xff1a;3.9 安裝依賴庫&#xff1a; pip install tensorflow2.13 matplotlib numpy -i https://mirrors.aliyun.com/pypi/simple 代碼實現&#xff1a; import tensorflow as tf from tensorflow.keras.models import Sequent…