在用于实现GUIExtenderService
的CustusX扩展的自定义插件中,我想要访问超声探头的流图像及其位置。
VideoSource 有两个主要用户:渲染到屏幕并录制到磁盘。 VideoGraphics 包含Reps在视图中渲染时使用的可视化功能。 VideoGraphics 需要探测来提供位置信息。 探测器还使用自己的ProbeAdapterVideoSource(使用适配器模式)包装 VideoSource ,以添加VideoSource未知的特殊信息,例如像素间距。
据我了解,VideoSource
负责图像,Probe
负责该位置。如果我从VideoSource
开始并连接到newFrame
并使用getVtkImageData
检索图像,我只会获取图像数据。所以问题是:如何获得该帧的图像帧及其相应的位置信息? (通过VideoSource
和Probe
或其他方式)。
答案 0 :(得分:1)
您需要Probe
及相关对象的实例:
VisServicesPtr services = VisServices::create(context);
ToolPtr tool = services->trackingService->getTool("myprobe");
ProbePtr probe = tool->getProbe();
VideoSourcePtr video = probe->getRTSource();
现在您有tool
,其中包含probe
,其中包含video
。 video
提供图片流,tool
和probe
提供位置信息。根据{{3}},图像的位置可以表示为变换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(以像素为单位)可以使用:
转换为全局空间rVector3D p_v(p[0]*spacing[0], p[1]*spacing[1])
Vector3D p_r = rMv.coord(p_v);
注意:以这种方式获得的位置将是最后一次采样的跟踪位置,不一定与图像帧同时获得。插入下一个跟踪位置(在图像帧之后重现)可以提高准确性,但这取决于具体的用例。