2015-06-05 78 views
1

在一個自定義插件擴展的CustusX實現GUIExtenderService我想訪問流式圖像的超聲波探頭及其位置。獲取視頻源/探頭的視頻幀的位置信息在CustusX

Documentation說:

VideoSource有兩個主要用戶:渲染到屏幕和記錄到磁盤。 VideoGraphics包含Reps在視圖中渲染時使用的可視化功能。 VideoGraphics需要探針提供位置信息。 探針還利用其自己的ProbeAdapterVideoSource(使用適配器模式)包裝VideoSource以添加VideoSource未知的特殊信息,例如像素間距。

所以據我瞭解,VideoSource是負責形象和Probe的位置。如果我從VideoSource開始並且連接到,並用getVtkImageData檢索圖像,我只能獲取圖像數據。所以問題是:我怎樣才能獲得一個圖像幀及其相應的位置信息爲該幀? (通過VideoSourceProbe或通過其他方式)。

回答

1

您需要Probe和相關對象的實例:

VisServicesPtr services = VisServices::create(context); 
ToolPtr tool = services->trackingService->getTool("myprobe"); 
ProbePtr probe = tool->getProbe(); 
VideoSourcePtr video = probe->getRTSource(); 

現在你有一個tool,包含probe,包含videovideo提供圖像流,而toolprobe提供位置信息。根據the documentation,圖像的位置可以表示爲變換rMv,其中r是全局參考空間,v是以毫米爲單位的圖像空間。要轉換爲像素,請乘以圖像間距。 rMv可以使用發現:

Transform3D rMpr, prMt, tMu, uMv, rMv; 
rMpr = services->patientModelService->get_rMpr(); 
prMt = tool->get_prMt(); 
tMu = probe->getSector()->get_tMu(); 
uMv = probe->getSector()->get_uMv(); 
rMv = rMpr*prMt*tMu*uMv; 

變換rMpr是病人登記,是一種身份,如果你正在做的只是流。現在

,以像素爲單位的像素位置p可使用被轉換成全局空間R:

Vector3D p_v(p[0]*spacing[0], p[1]*spacing[1])  
Vector3D p_r = rMv.coord(p_v); 

注:獲得這樣的方式將是最後採樣的跟蹤位置,不一定與圖像同時獲得的位置幀。插入下一個跟蹤位置(在圖像幀之後採集)可以提高準確性,但這取決於具體的使用情況。

+0

我不知道命名方案,應該閱讀[座標系統文檔](http://custusx.org/uploads/developer_doc/nightly/coordinate_systems.html)。所以'r'是全球性的,'患者','工具','超聲波平面和'v'倒置超聲平面。也許像'tool-> get_prMt(); //病人空間 - >工具空間和其他轉換的模擬將使示例代碼更容易閱讀。 – Joma

+0

可以補充說,要運行代碼,在CMakeLists.txt中,cxResourceVisualization必須位於PLUGIN_target_libraries中,才能在include路徑中包含cxVisServices.h。我可以包含其他必要的頭文件(cxProbeSector.h,cxPatientModelService.h和cxTransform3D.h)。 – Joma

+0

使用座標和空格時,符號就是一切。 CustusX一貫使用空間名稱r,pr,t,u等,以及符號p_b = bMa * p_a進行轉換。這也給出了可讀鏈式變換(即,p_c = cMb * bMa * p_a)。我更喜歡這樣評論重複的代碼,並且隨着時間的推移可能會偏離代碼。 –