Hi,
I was wondering if it is possible to save an ultrasound sweep as an .mha file, similar to a the file format used when importing a “freehand Ultrasound file” in ImFusion? I need to use the saved file with PLUS toolkit afterwards.
In case that is not possible, can you help me figure out how I can use imfusion to correctly calibrate and then compound a volume that was recorded using slicer with its plugins?
I have the config file that looks like this (and not that much experience with slicer):
<PlusConfiguration version="2.3" PlusRevision="Plus-2.1.2.3840 - Win64">
<DataCollection StartupDelaySec="1">
<DeviceSet Name="slicer1 calibration depth55" Description="slicer Hitachi Avius TRUS probe for prostate imaging; Startech framegrabber image acquisition via wmf + NDI Polaris for tracking - slicer with bed and server" />
<Device
Id="TrackerDevice"
Type="PolarisTracker"
SerialPort="4"
BaudRate="115200"
AcquisitionRate="20"
LocalTimeOffsetSec="0"
ToolReferenceFrame="Tracker">
<DataSources>
<DataSource
Type="Tool"
Id="Reference"
PortName="4"
RomFile="NdiToolDefinitions\8700339.rom"
AveragedItemsForFiltering="20"
BufferSize="500" />
<DataSource
Type="Tool"
Id="Stylus"
PortName="5"
RomFile="NdiToolDefinitions\8700340.rom"
AveragedItemsForFiltering="20"
BufferSize="500" />
<DataSource
Type="Tool"
Id="Probe"
PortName="6"
RomFile="NdiToolDefinitions\SELapProbeTarget.rom"
AveragedItemsForFiltering="20"
BufferSize="500" />
</DataSources>
<OutputChannels>
<OutputChannel Id="TrackerStream">
<DataSource Id="Probe" />
<DataSource Id="Reference" />
<DataSource Id="Stylus" />
</OutputChannel>
</OutputChannels>
</Device>
<Device
Id="VideoDevice"
Type="MmfVideo"
AcquisitionRate="30"
FrameSize="1280 1024"
VideoFormat="YUY2"
ClipRectangleOrigin="448 100"
ClipRectangleSize="382 500"
CaptureDeviceId="0"
LocalTimeOffsetSec="-0.265809">
<DataSources>
<DataSource Type="Video" Id="Video" PortUsImageOrientation="MN" BufferSize="125" AveragedItemsForFiltering="20" />
</DataSources>
<OutputChannels>
<OutputChannel Id="VideoStream" VideoDataSourceId="Video" />
</OutputChannels>
</Device>
<Device Id="TrackedVideoDevice" Type="VirtualMixer">
<InputChannels>
<InputChannel Id="TrackerStream" />
<InputChannel Id="VideoStream" />
</InputChannels>
<OutputChannels>
<OutputChannel Id="TrackedVideoStream" />
</OutputChannels>
</Device>
</DataCollection>
<Rendering WorldCoordinateFrame="Tracker" DisplayedImageOrientation="MN">
<DisplayableObject Type="Model" ObjectCoordinateFrame="StylusTip" Id="StylusModel" File="Stylus_Example.stl"
ModelToObjectTransform="
1 0 0 -210
0 1 0 0
0 0 1 0
0 0 0 1" />
<DisplayableObject
Id="PhantomModel"
Type="Model"
ObjectCoordinateFrame="Phantom"
Opacity="0.6"
File="fCal_3.1.stl"
ModelToObjectTransform="
1 0 0 -35
0 1 0 -10
0 0 1 -5
0 0 0 1" />
<xDisplayableObject Type="Image" ObjectCoordinateFrame="Image" Id="LiveImage" />
</Rendering>
<CoordinateDefinitions>
<Transform From="FanCenter" To="Image"
Matrix="
1 0 0 650
0 1 0 375
0 0 1 0
0 0 0 1"
Date="061614_134315" />
<Transform From="Image" To="Probe"
Matrix="
0.01 -0.11 -0.01 -159.61
0.01 0.01 -0.11 -12.13
0.11 0.01 0.01 -128.94
0 0 0 1"
Date="102814_140005" />
<Transform From="Needle1" To="Image"
Matrix="
1 0 0 518
0 1 0 451
0 0 1 0
0 0 0 1"
Date="061614_135401" />
<Transform From="Needle2" To="Image"
Matrix="
1 0 0 525
0 1 0 700
0 0 1 0
0 0 0 1"
Date="061614_135401" />
<Transform From="Phantom" To="Reference"
Matrix="
-0.0571189 0.0204642 0.998158 -99.8429
0.998362 0.00459566 0.0570364 26.2209
-0.00341999 0.99978 -0.0206932 24.4181
0 0 0 1"
Error="0.635785" Date="060214_154053" />
<Transform From="Reference" To="Bed"
Matrix="
0 -1 0 0
0 0 1 0
-1 0 0 0
0 0 0 1"
Date="061014_135800" />
<Transform From="StylusTip" To="Stylus"
Matrix="
-0.121916 0.000692834 0.99254 -19.576
0.00568278 0.999984 0 0.912481
-0.992524 0.00564039 -0.121918 -159.369
0 0 0 1"
Error="0.26685" Date="041714_155202" />
<Transform From="TransducerOriginPixel" To="TransducerOrigin"
Matrix="
0.116703 0 0 0
0 0.126069 0 0
0 0 0.121431 0
0 0 0 1"
Date="071714_143405" />
</CoordinateDefinitions>
<Segmentation
ApproximateSpacingMmPerPixel="0.114712"
MorphologicalOpeningCircleRadiusMm="0.17"
MorphologicalOpeningBarSizeMm="1"
ClipRectangleOrigin="411 480"
ClipRectangleSize="507 393"
MaxLinePairDistanceErrorPercent="10"
AngleToleranceDegrees="10"
MaxAngleDifferenceDegrees="10"
MinThetaDegrees="-70"
MaxThetaDegrees="70"
MaxLineShiftMm="10"
ThresholdImagePercent="15"
CollinearPointsMaxDistanceFromLineMm="0.6"
UseOriginalImageIntensityForDotIntensityScore="0"
NumberOfMaximumFiducialPointCandidates="9" />
<PhantomDefinition>
<Description Name="fCAL" Type="Triple-N" Version="3.0" WiringVersion="1.0" Institution="IFL TUM" />
<Geometry>
<Pattern Type="NWire">
<Wire Name="7:G6_g6" EndPointFront="60.0 0.0 0.0" EndPointBack="60.0 40.0 0.0" />
<Wire Name="8:J6_g6" EndPointFront="90.0 0.0 0.0" EndPointBack="60.0 40.0 0.0" />
<Wire Name="9:J6_j6" EndPointFront="90.0 0.0 0.0" EndPointBack="90.0 40.0 0.0" />
</Pattern>
<Pattern Type="NWire">
<Wire Name="4:G7_g7" EndPointFront="60.0 0.0 -10.0" EndPointBack="60.0 40.0 -10.0" />
<Wire Name="5:G7_j7" EndPointFront="60.0 0.0 -10.0" EndPointBack="90.0 40.0 -10.0" />
<Wire Name="6:J7_j7" EndPointFront="90.0 0.0 -10.0" EndPointBack="90.0 40.0 -10.0" />
</Pattern>
<Pattern Type="NWire">
<Wire Name="1:H8_h8" EndPointFront="70.0 0.0 -20.0" EndPointBack="70.0 40.0 -20.0" />
<Wire Name="2:J8_h8" EndPointFront="90.0 0.0 -20.0" EndPointBack="70.0 40.0 -20.0" />
<Wire Name="3:J8_j8" EndPointFront="90.0 0.0 -20.0" EndPointBack="90.0 40.0 -20.0" />
</Pattern>
<Landmarks>
<Landmark Name="#1" Position="186 -5.0 35.5" />
<Landmark Name="#2" Position="186 -5.0 -19.5" />
<Landmark Name="#3" Position="186 -5.0 -94.5" />
<Landmark Name="#4" Position="186 45.0 40.5" />
<Landmark Name="#5" Position="186 45.0 10.5" />
<Landmark Name="#6" Position="186 45.0 -94.5" />
<Landmark Name="#7" Position="-32.3 45.0 40.5" />
<Landmark Name="#8" Position="-32.3 45.0 10.5" />
<Landmark Name="#9" Position="-32.3 45.0 -94.5" />
<Landmark Name="#10" Position="-32.5 -5.0 40.5" />
<Landmark Name="#11" Position="-32.5 -5.0 -19.5" />
<Landmark Name="#12" Position="-32.9 -5.0 -84.5" />
</Landmarks>
</Geometry>
</PhantomDefinition>
<VolumeReconstruction
ImageCoordinateFrame="Image"
ReferenceCoordinateFrame="Bed"
OutputSpacing="0.5 0.5 0.5"
ClipRectangleOrigin="255 380"
ClipRectangleSize="780 534"
FanAnglesDeg="-70 70"
FanOriginPixel="640 380"
FanRadiusStartPixel="105"
FanRadiusEndPixel="700"
Interpolation="LINEAR"
Optimization="FULL"
Compounding="ON"
FillHoles="ON"
NumberofThreads="1">
<HoleFilling>
<HoleFillingElement Type="GAUSSIAN_ACCUMULATION" Size="3" Stdev="0.5" MinimumKnownVoxelsRatio="0.5" />
</HoleFilling>
</VolumeReconstruction>
<PlusOpenIGTLinkServer MaxNumberOfIgtlMessagesToSend="10" MaxTimeSpentWithProcessingMs="10" ListeningPort="18944" SendValidTransformsOnly="true" OutputChannelId="TrackedVideoStream">
<DefaultClientInfo>
<MessageTypes>
<Message Type="TRANSFORM" />
</MessageTypes>
<TransformNames>
<Transform Name="ProbeToBed" />
<Transform Name="ImageToProbe" />
<Transform Name="FanCenterToImage" />
<Transform Name="Needle1ToImage" />
<Transform Name="Needle2ToImage" />
</TransformNames>
</DefaultClientInfo>
</PlusOpenIGTLinkServer>
<fCal
PhantomModelId="PhantomModel"
ReconstructedVolumeId="Volume"
TransducerModelId="ProbeModel"
StylusModelId="StylusModel"
ImageDisplayableObjectId="LiveImage"
NumberOfCalibrationImagesToAcquire="100"
NumberOfValidationImagesToAcquire="50"
NumberOfStylusCalibrationPointsToAcquire="200"
RecordingIntervalMs="100"
MaxTimeSpentWithProcessingMs="30"
ImageCoordinateFrame="Image"
ProbeCoordinateFrame="Probe"
ReferenceCoordinateFrame="Bed"
TransducerOriginCoordinateFrame="TransducerOrigin"
TransducerOriginPixelCoordinateFrame="TransducerOriginPixel"
TemporalCalibrationDurationSec="10"
DefaultSelectedChannelId="TrackedVideoStream" />
<vtkPivotCalibrationAlgo ObjectMarkerCoordinateFrame="Stylus" ReferenceCoordinateFrame="Reference" ObjectPivotPointCoordinateFrame="StylusTip" />
<vtkPhantomLandmarkRegistrationAlgo PhantomCoordinateFrame="Phantom" ReferenceCoordinateFrame="Reference" StylusTipCoordinateFrame="StylusTip" />
<vtkProbeCalibrationAlgo ImageCoordinateFrame="Image" ProbeCoordinateFrame="Probe" PhantomCoordinateFrame="Phantom" ReferenceCoordinateFrame="Reference" />
</PlusConfiguration>
Please let me know if further information is needed. Unfortunately, I can not share the sweep bc of data privacy issues.
Many thanks,
Farid