刚才一直获取的配准结果不对,现在终于搞明白了,在elastix的输出结果中,他会把每个阶段的结果进行保存,比如,你给了一个初始矩阵,然后,你有进行了两个阶段的优化,那么他会保存三个结果,、
const auto * const transformParameterObject = filter->GetTransformParameterObject(); assert(transformParameterObject != nullptr); const auto & transformParameterMaps = transformParameterObject->GetParameterMaps(); assert(!transformParameterMaps.empty());其中,这个transformParameterMaps 会保存所有的阶段结果。打印结果如下:
for (size_t i = 0; i < transformParameterMaps.size(); ++i) { std::cout << "\n========== Transform " << i << " ==========\n"; const auto& paramMap = transformParameterMaps[i]; for (const auto& kv : paramMap) { std::cout << kv.first << " : "; for (const auto& v : kv.second) { std::cout << v << " "; } std::cout << std::endl; } } ========== Transform 0 ========== CenterOfRotationPoint : -29.565856 43.373462 -43.645097 NumberOfParameters : 6 Transform : EulerTransform TransformParameters : 0.100167 -0.119756 -0.064229 21.029042 162.581471 -566.328174 ========== Transform 1 ========== CenterOfRotationPoint : -8.975933215363828 205.57272983636832 -610.0644672464044 CompressResultImage : false ComputeZYX : false DefaultPixelValue : 0 Direction : -1 0 0 0 -1 0 0 0 1 FinalBSplineInterpolationOrder : 3 FixedImageDimension : 3 FixedInternalImagePixelType : float HowToCombineTransforms : Compose Index : 0 0 0 InitialTransformParameterFileName : InitialTransformParameters.0.txt MovingImageDimension : 3 MovingInternalImagePixelType : float NumberOfParameters : 6 Origin : 39.60080925959355 107.540127428 -146.14509751623166 ResampleInterpolator : FinalBSplineInterpolator Resampler : DefaultResampler ResultImageFormat : mhd ResultImagePixelType : float Size : 168 156 83 Spacing : 0.8333333129999999 0.8333333129999999 2.5000000078431373 Transform : EulerTransform TransformParameters : -0.17161774953499787 0.04006955735100518 0.27931639772060396 -5.642834746343563 -0.152733217628487 43 1.1293263422699034 UseDirectionCosines : true而我一开始用的试试transformParameterMaps.front,永远用的是第一个矩阵,也就是我的输入的初始化矩阵
最终结果怎么获取呢?
//////////////////////////////////////////////////// Eigen::Matrix4d T_final = Eigen::Matrix4d::Identity(); const auto & maps = transformParameterObject->GetParameterMaps(); for (size_t k = 0; k < maps.size(); ++k) { const auto & m = maps[k]; auto params = toDouble(m.at("TransformParameters")); auto center = toDouble(m.at("CenterOfRotationPoint")); std::vector<float> mat = buildTransformMatrix(params, center); Eigen::Matrix4d T; for (int i = 0; i < 16; ++i) T(i/4, i%4) = mat[i]; // ⚠️ 关键:按顺序累乘 T_final = T * T_final; }