SMILX  1.01
milxRegistration.h
1 /*=========================================================================
2 Program: milxAliBaba
3 Module: milxRegistration.h
4 Author: ?
5 Modified by: Nicholas Dowson
6 Language: C++
7 Created: ?
8 
9 Copyright: (c) 2009 CSIRO, Australia.
10 
11 This software is protected by international copyright laws.
12 Any unauthorised copying, distribution or reverse engineering is prohibited.
13 
14 Licence:
15 All rights in this Software are reserved to CSIRO. You are only permitted
16 to have this Software in your possession and to make use of it if you have
17 agreed to a Software License with CSIRO.
18 
19 BioMedIA Lab: http://www.ict.csiro.au/BioMedIA/
20 =========================================================================*/
21 
22 #ifndef __milxRegistration_h
23 #define __milxRegistration_h
24 
25 #include <itkLinearInterpolateImageFunction.h>
26 #include <itkBSplineInterpolateImageFunction.h>
27 #include <itkNearestNeighborInterpolateImageFunction.h>
28 
29 #if ITK_VERSION_MAJOR < 4
30 #include <itkOrientedImage.h>
31 #include <itkOrientationAdapter.h>
32 #else
33 #include <itkImage.h>
34 #include <itkOrientationAdapterBase.h>
35 #endif
36 
37 #include <fstream>
38 #include <iostream>
39 #include <string>
40 #include <vector>
41 #include <cstdlib>
42 #include <zlib.h>
43 #include <itkOrientImageFilter.h>
44 
45 
46 namespace milx
47 {
48 
71 {
72 
73 public:
74  Registration();
75  ~Registration();
76 
77  //ND
78  //typedef unsigned int RegistrationMode;
79 
80  typedef float InputPixelType;
81  typedef float OutputPixelType;
82  typedef itk::Vector<InputPixelType, 3 > VectorPixelType;
83  typedef itk::Image<VectorPixelType, 3 > DemonsDeformationFieldType;
84 
85  typedef itk::Image<InputPixelType,3> InputImageType;
86  typedef itk::Image<OutputPixelType,3> OutputImageType;
87 
88 
89  typedef itk::NearestNeighborInterpolateImageFunction<InputImageType, double > NearestNeighborInterpolatorType;
90  typedef itk::LinearInterpolateImageFunction<InputImageType, double > LinearInterpolatorType;
91  typedef itk::BSplineInterpolateImageFunction<InputImageType, double, double > BsplineInterpolatorType;
92 
93  // Used by ITK NMI
94  typedef itk::Vector< float, 3 > VectorType;
95 #if ITK_VERSION_MAJOR < 4
96  typedef itk::OrientedImage< InputPixelType, 3> FixedImageType;
97  typedef itk::OrientedImage< InputPixelType, 3 > MovingImageType;
98  typedef itk::OrientedImage< VectorType, 3 > FieldType;
99 #else
100  typedef itk::Image< InputPixelType, 3> FixedImageType;
101  typedef itk::Image< InputPixelType, 3 > MovingImageType;
102  typedef itk::Image< VectorType, 3 > FieldType;
103 #endif
104 
105  typedef itk::NearestNeighborInterpolateImageFunction<FixedImageType, double > NearestNeighborOrientatedInterpolatorType;
106  typedef itk::LinearInterpolateImageFunction<FixedImageType, double > LinearOrientatedInterpolatorType;
107  typedef itk::BSplineInterpolateImageFunction<FixedImageType, double, double > BsplineOrientatedInterpolatorType;
108 
109  typedef enum {
110  ALADIN_RIGID=0, // aladin2000 Rigid
111  ITK_RIGID=1, // ITK NMI Rigid
112  ALADIN_AFFINE=2, // aladin2000 Affine
113  ITK_AFFINE=3, // ITK NMI Affine
114  ALADIN_DIFFDEMONS=4, // aladin2000 Affine + Demons NRR
115  ITK_AFFINEBSPLINE=5, // ITK NMI Affine + BSpline NRR
116  ALIBABA_RIGID=6, // milxAliBaba Rigid
117  ALIBABA_AFFINE=7, // milxAliBaba Affine
118  ALADIN_MILXBSPLINE=8, // aladin2000 Affine + BSpline NRR
119  NIFTI_REG=9, // NiftyReg Affine + NiftyReg NRR
120  NIFTI_ALADIN_REG=10, // NiftyReg Affine
121  ITK_AFFINE_DIFFDEMONS=11, // ITK NMI Affine + Demons NRR
122  ITKALADIN_DIFFDEMONS=12, // ITK aladin Affine + Demons NRR
123  DIFFDEMONS=13 // ITK aladin Affine + Demons NRR
124  } RegistrationMode;
125 
126  typedef enum { INTERP_NEAREST=0, INTERP_LINEAR=1, INTERP_BSPLINE=2, INTERP_BSPLINE5=3 } InterpolateMode;
127  typedef enum { VOTING=0, MULTISTAPLE=1 } ConsensusMode;
128 
129  void writeFile3D(FixedImageType::Pointer image, std::string outputFileName);
130  FixedImageType::Pointer readFile3D(std::string fileName);
136  bool LoadSettings(std::string /*filename*/)
137  {
138  return false;
139  }
140 
145  {
146  return m_CaseFilenames.size();
147  }
148 
149  int GetNumberOfCases2()
150  {
151  return m_CaseFilenames2.size();
152  }
153 
154  int GetNumberOfAtlases()
155  {
156  return m_AtlasFilenames.size();
157  }
158 
159  int GetNumberOfLabellings()
160  {
161  return m_LabellingFilenames.size();
162  }
163 
164  std::vector<int> GetCaseIDs()
165  {
166  return m_CaseIDs;
167  }
168 
169  std::vector<std::string> GetCaseFileNames()
170  {
171  return m_CaseFilenames;
172  }
173 
174  std::vector<std::string> GetCaseFileNames2()
175  {
176  return m_CaseFilenames2;
177  }
178 
179  std::string GetCaseFileName(int caseID)
180  {
181  for(int i = 0; i < this->GetNumberOfCases(); i++)
182  {
183  if(m_CaseIDs[i] == caseID)
184  return m_CaseFilenames[i];
185  }
186  std::cerr << "Warning caseID " << caseID << " not found ?" <<std::endl;
187  return NULL;
188  }
189 
190  std::string GetCaseFileName2(int caseID)
191  {
192  if(m_CaseFilenames2.size() == m_CaseFilenames.size())
193  {
194  std::cerr << "Bailing as File2size != File1size" <<std::endl;
195  return NULL;
196  }
197  for(int i = 0; i < this->GetNumberOfCases(); i++)
198  {
199  if(m_CaseIDs[i] == caseID)
200  return m_CaseFilenames2[i];
201  }
202  std::cerr << "Warning caseID " << caseID << " not found ?" <<std::endl;
203  return NULL;
204  }
205 
206  std::vector<int> GetAtlasIDs()
207  {
208  return m_AtlasIDs;
209  }
210  std::vector<std::string> GetAtlasFileNames()
211  {
212  return m_AtlasFilenames;
213  }
214  std::string GetAtlasFileName(int caseID)
215  {
216  for(int i = 0; i < this->GetNumberOfAtlases(); i++)
217  {
218  if(m_AtlasIDs[i] == caseID)
219  return m_AtlasFilenames[i];
220  }
221  std::cerr << "Warning caseID " << caseID << " not found ?" <<std::endl;
222  return NULL;
223  }
224 
225  std::vector<int> GetLabellingIDs()
226  {
227  return m_LabellingIDs;
228  }
229  std::vector<std::string> GetLabellingFileNames()
230  {
231  std::cout << "Get Labelled filenames " << m_LabellingFilenames.size() << std::endl;
232  return m_LabellingFilenames;
233  }
234  std::vector<std::string> GetLabellingFileNames(int caseID)
235  {
236  std::vector<std::string> labellingNames;
237  for(int i = 0; i < this->GetNumberOfLabellings(); i++)
238  {
239  if(m_LabellingIDs[i] == caseID)
240  labellingNames.push_back(m_LabellingFilenames[i]);
241  }
242  return labellingNames;
243  }
244 
245 
250  std::vector<std::string> GetPropagatedOutputAtlases()
251  {
252 
253  return m_PropagatedAtlases;
254  }
255  std::vector<std::string> GetPropagatedOutputTransforms()
256  {
257  return m_PropagatedTransforms;
258  }
259  std::string GetPropagatedOutputAtlases(int caseID)
260  {
261  for(int i = 0; i < this->GetNumberOfAtlases(); i++)
262  {
263  if(m_AtlasIDs[i] == caseID)
264  return m_PropagatedAtlases[i];
265  }
266  std::cerr << "Warning caseID " << caseID << " not found when returning propagated atlases ?" <<std::endl;
267  return NULL;
268  }
269 
270  std::vector<std::string> GetPropagatedOutputLabels()
271  {
272  return m_PropagatedLabelling;
273  }
274  std::vector<std::string> GetPropagatedOutputLabels(int caseID)
275  {
276  std::vector<std::string> labellingNames;
277  for(int i = 0; i < this->GetNumberOfLabellings(); i++)
278  {
279  if(m_LabellingIDs[i] == caseID)
280  labellingNames.push_back(m_PropagatedLabelling[i]);
281  }
282  return labellingNames;
283  }
284  bool ClearPropagatedOutputAtlasesLabels()
285  {
286  m_PropagatedAtlases.clear();
287  m_PropagatedLabelling.clear();
288  return true;
289  }
290 
291 
295  bool SetCase(int caseID, std::string filenames)
296  {
297  std::vector<int> ids;
298  ids.push_back(caseID);
299  std::vector<std::string> caseFilenames;
300  caseFilenames.push_back(filenames);
301  return this->SetCases(ids, caseFilenames);
302  }
303  bool SetCases(std::vector<int> caseIDs, std::vector<std::string> caseFilenames)
304  {
305  m_CaseIDs = caseIDs;
306  m_CaseFilenames = caseFilenames;
307  return true;
308  }
309  bool SetCasePair(int caseID, std::string filenames, std::string filenames2)
310  {
311  std::vector<int> ids;
312  ids.push_back(caseID);
313  std::vector<std::string> caseFilenames;
314  caseFilenames.push_back(filenames);
315  std::vector<std::string> caseFilenames2;
316  caseFilenames2.push_back(filenames2);
317  return this->SetCasesPair(ids, caseFilenames, caseFilenames2);
318  }
319  bool SetCasesPair(std::vector<int> caseIDs, std::vector<std::string> caseFilenames, std::vector<std::string> caseFilenames2)
320  {
321  m_CaseIDs = caseIDs;
322  m_CaseFilenames = caseFilenames;
323  m_CaseFilenames2 = caseFilenames2;
324  return true;
325  }
326  bool ClearCases()
327  {
328  m_CaseIDs.clear();
329  m_CaseFilenames.clear();
330  return true;
331  }
332 
339  bool SetAtlases(std::vector<int> atlasIDs, std::vector<std::string> atlasFilenames)
340  {
341  m_AtlasIDs = atlasIDs;
342  m_AtlasFilenames = atlasFilenames;
343  return true;
344  }
345  bool SetAtlas(int atlasIDs, std::string atlasFilenames)
346  {
347  m_AtlasIDs.push_back(atlasIDs);
348  m_AtlasFilenames.push_back(atlasFilenames);
349  return true;
350  }
351 
352  bool SetAtlases(std::vector<int> atlasIDs, std::vector<std::string> atlasFilenames, std::vector<int> labellingIDs, std::vector<std::string> labellingFilenames)
353  {
354  m_AtlasIDs = atlasIDs;
355  m_AtlasFilenames = atlasFilenames;
356  m_LabellingIDs = labellingIDs;
357  m_LabellingFilenames = labellingFilenames;
358  std::cout << "Labelling filename " << m_LabellingFilenames.size() << std::endl;
359 
360  return true;
361  }
362 
363  bool SetAtlases(std::vector<int> atlasIDs,
364  std::vector<std::string> atlasFilenames,
365  std::vector<int> labellingIDs,
366  std::vector<std::string> labellingFilenames,
367  std::vector<int> maskIDs,
368  std::vector<std::string> maskFilenames)
369  {
370  m_AtlasIDs = atlasIDs;
371  m_AtlasFilenames = atlasFilenames;
372  m_LabellingIDs = labellingIDs;
373  m_LabellingFilenames = labellingFilenames;
374  std::cout << "Labelling filename " << m_LabellingFilenames.size() << std::endl;
375 
376  m_MaskIDs = maskIDs;
377  m_MaskFilenames= maskFilenames;
378  std::cout << "Number of image masks used " << m_MaskFilenames.size() << std::endl;
379 
380  return true;
381  }
382 
383  bool SetAtlases(std::vector<int> atlasIDs,
384  std::vector<std::string> atlasFilenames,
385  std::vector<int> labellingIDs,
386  std::vector<std::string> labellingFilenames,
387  std::vector<int> maskIDs,
388  std::vector<std::string> maskFilenames,
389  std::vector<std::string> maskFilenames2)
390  {
391  m_AtlasIDs = atlasIDs;
392  m_AtlasFilenames = atlasFilenames;
393  m_LabellingIDs = labellingIDs;
394  m_LabellingFilenames = labellingFilenames;
395  std::cout << "Labelling filename " << m_LabellingFilenames.size() << std::endl;
396 
397  m_MaskIDs = maskIDs;
398  m_MaskFilenames= maskFilenames;
399  m_MaskFilenames2= maskFilenames2;
400  std::cout << "Number of image masks used " << m_MaskFilenames.size() << std::endl;
401  std::cout << "Number of image masks2 used " << m_MaskFilenames2.size() << std::endl;
402 
403  return true;
404  }
405 
406  bool SetAtlas(int atlasIDs, std::string atlasFilenames, std::vector<std::string> labellingFilenames)
407  {
408  m_AtlasIDs.push_back(atlasIDs);
409  m_AtlasFilenames.push_back(atlasFilenames);
410  for (unsigned int i=0; i<labellingFilenames.size(); i++)
411  m_LabellingIDs.push_back(atlasIDs);
412  m_LabellingFilenames = labellingFilenames;
413  std::cout << "Labelling filename " << m_LabellingFilenames.size() << " " << m_LabellingIDs.size() << std::endl;
414  return true;
415  }
416 
417  bool ClearAtlases()
418  {
419  m_AtlasIDs.clear();
420  m_AtlasFilenames.clear();
421  m_LabellingIDs.clear();
422  m_LabellingFilenames.clear();
423  return true;
424  }
425 
430  void SetOutputPrefix(std::string prefix)
431  {
432  m_OutputPrefix = prefix;
433  }
434  std::string GetOutputPrefix()
435  {
436  return m_OutputPrefix;
437  }
438 
442  // Used inside registration algorithm (only used in ITK methods)
443  bool SetRegistrationInterpolation(InterpolateMode mode)
444  {
445  m_RegistrationInterpolation = mode;
446  return true;
447  }
448  // Used to propogate atlas
449  bool SetAtlasInterpolation(InterpolateMode mode)
450  {
451  m_AtlasInterpolation = mode;
452  return true;
453  }
454  // Used to propogate labels
455  bool SetLabelledImageInterpolation(InterpolateMode mode)
456  {
457  m_LabelledImageInterpolation = mode;
458  return true;
459  }
460  bool SetLabelledImageInterpolation(std::vector<InterpolateMode> modes)
461  {
462  m_MultipleLabelledImageInterpolation = modes;
463  return true;
464  }
465 
470  void SetUseConsensus(bool flag)
471  {
472  m_UseConsensus = flag;
473  }
474  bool GetUseConsensus()
475  {
476  return m_UseConsensus;
477  }
478 
482  bool SetRegistrationMode(int registrationScheme, std::string configFilename = "NULL")
483  {
484  std::cout << "milxRegistration::SetRegistrationModeSet " << registrationScheme << std::endl;
485  if(registrationScheme == 0)
486  {
487  RegistrationMode mode = ALADIN_RIGID;
488  this->SetRegistrationMode(mode, configFilename);
489  }
490  else if(registrationScheme == 1)
491  {
492  RegistrationMode mode = ITK_RIGID;
493  this->SetRegistrationMode(mode, configFilename);
494  }
495  else if(registrationScheme == 2)
496  {
497  RegistrationMode mode = ALADIN_AFFINE;
498  this->SetRegistrationMode(mode, configFilename);
499  }
500  else if(registrationScheme == 3)
501  {
502  RegistrationMode mode = ITK_AFFINE;
503  this->SetRegistrationMode(mode, configFilename);
504  }
505  else if(registrationScheme == 4)
506  {
507  RegistrationMode mode = ALADIN_DIFFDEMONS;
508  this->SetRegistrationMode(mode, configFilename);
509  }
510  else if(registrationScheme == 5)
511  {
512  RegistrationMode mode = ITK_AFFINEBSPLINE;
513  this->SetRegistrationMode(mode, configFilename);
514  }
515  else if(registrationScheme == 6)
516  {
517  RegistrationMode mode = ALIBABA_RIGID; //ND
518  this->SetRegistrationMode(mode, configFilename);
519  }
520  else if(registrationScheme == 7)
521  {
522  RegistrationMode mode = ALIBABA_AFFINE; //ND
523  this->SetRegistrationMode(mode, configFilename);
524  }
525  else if(registrationScheme == 8)
526  {
527  RegistrationMode mode = ALADIN_MILXBSPLINE; //JF
528  this->SetRegistrationMode(mode, configFilename);
529  }
530  else if(registrationScheme == 9)
531  {
532  RegistrationMode mode = NIFTI_REG; //PB
533  this->SetRegistrationMode(mode, configFilename);
534  }
535  else if(registrationScheme == 10)
536  {
537  RegistrationMode mode = NIFTI_ALADIN_REG; //PB
538  this->SetRegistrationMode(mode, configFilename);
539  }
540  else if(registrationScheme == 11)
541  {
542  RegistrationMode mode = ITK_AFFINE_DIFFDEMONS; //PB
543  this->SetRegistrationMode(mode, configFilename);
544  }
545  else if(registrationScheme == 12)
546  {
547  RegistrationMode mode = ITKALADIN_DIFFDEMONS; //PB
548  this->SetRegistrationMode(mode, configFilename);
549  }
550  else if(registrationScheme == 13)
551  {
552  RegistrationMode mode = DIFFDEMONS; //DRH
553  this->SetRegistrationMode(mode, configFilename);
554  }
555  else
556  {
557  std::cerr << "Unknown registration mode: " << registrationScheme << std::endl;
558  return false;
559  }
560 
561  return true;
562  }
563  bool SetRegistrationMode(RegistrationMode registrationScheme,
564  std::string /*configFilename = "NULL"*/ )
565  {
566  m_RegistrationMode = registrationScheme;
567  return true;
568  }
569  RegistrationMode GetRegistrationMode()
570  {
571  return this->m_RegistrationMode;
572  }
573 
577  bool SetConsensusMode(int consensusScheme, std::string configFilename = "NULL")
578  {
579  std::cout << "Set Mode " << consensusScheme << std::endl;
580  if(consensusScheme == 0)
581  {
582  ConsensusMode mode = VOTING;
583  this->SetConsensusMode(mode, configFilename);
584  }
585  else if(consensusScheme == 1)
586  {
587  ConsensusMode mode = MULTISTAPLE;
588  this->SetConsensusMode(mode, configFilename);
589  }
590  return true;
591  }
592  bool SetConsensusMode(ConsensusMode consensusScheme,
593  std::string /*configFilename = "NULL" */ )
594  {
595  m_ConsensusMode = consensusScheme;
596  return true;
597  }
598  ConsensusMode GetConsensusMode()
599  {
600  return this->m_ConsensusMode;
601  }
602 
606  bool ConfigureRegistration(RegistrationMode /*mode*/, std::string /*filename*/)
607  {
608  return true;
609  }
610 
620  void SetFilesToSave(int value)
621  {
622  m_SaveFiles = value;
623  }
624 
628  void UpdatePipeline() {};
629 
633  std::vector<int> m_AtlasIDs;
634  std::vector<std::string> m_AtlasFilenames;
635  std::vector<int> m_LabellingIDs;
636  std::vector<std::string> m_LabellingFilenames;
637 
638  std::vector<int> m_MaskIDs;
639  std::vector<std::string> m_MaskFilenames;
640  std::vector<std::string> m_MaskFilenames2;
641 
642  std::vector<int> m_CaseIDs;
643  std::vector<std::string> m_CaseFilenames;
644  std::vector<std::string> m_CaseFilenames2;
645 
646  std::string m_OutputPrefix;
647 
648  std::vector<std::string> m_PropagatedAtlases;
649  std::vector<std::string> m_PropagatedLabelling;
650  std::vector<std::string> m_PropagatedTransforms;
651 
652  InterpolateMode m_RegistrationInterpolation;
653  InterpolateMode m_AtlasInterpolation;
654  InterpolateMode m_LabelledImageInterpolation;
655  std::vector<InterpolateMode> m_MultipleLabelledImageInterpolation;
656 
657  RegistrationMode m_RegistrationMode;
658 
659  bool m_UseConsensus;
660  ConsensusMode m_ConsensusMode;
661 
662  int m_SaveFiles;
666  NearestNeighborInterpolatorType::Pointer m_NearestNeighborInterpolator;
667  LinearInterpolatorType::Pointer m_LinearInterpolator;
668  BsplineInterpolatorType::Pointer m_BsplineInterpolator;
669 
670  NearestNeighborOrientatedInterpolatorType::Pointer m_NearestNeighborOrientatedInterpolator;
671  LinearOrientatedInterpolatorType::Pointer m_LinearOrientatedInterpolator;
672  BsplineOrientatedInterpolatorType::Pointer m_BsplineOrientatedInterpolator;
673 
674  void Voting(std::vector<std::string> inputFilenames,
675  std::string outputFilename,
676  int modulo,
677  int N,
678  ConsensusMode consensusMode);
679 
685  // Warning: This code generally assumes that
686  // datafile is fixed and atlas is moving
687 
688 
689  bool RegisterRigidITK(std::string dataFile, std::string atlasFile, std::string outputPrefix, bool Invert, std::string dataMaskFile, std::string atlasMaskFile );
690  bool RegisterMilxNonRigid(std::string dataFile, std::string atlasFile, std::string outputName, bool Invert);
691  bool RegisterAffineITK(std::string dataFile, std::string atlasFile, std::string outputPrefix, bool Invert, std::string dataMaskFile, std::string atlasMaskFile );
692  bool RegisterNonRigidBsplineITK(std::string dataFile, std::string atlasFile, std::string outputPrefix, bool Invert, std::string dataMaskFile, std::string atlasMaskFile );
693  double NmiITK(std::string dataFile, std::string atlasFile);
694 
695  void LoadTRSF(std::string filename1, std::string filename2, double * array, bool invert);
696  void LoadTRSF(std::string filename, double * array, bool invert);
697 
698  bool PropagateAffine(std::string dataFile,
699  std::string outFile,
700  std::string targetFile,
701  double * array,
702  InterpolateMode mode,
703  itk::SpatialOrientation::ValidCoordinateOrientationFlags &flag,
704  itk::SpatialOrientationAdapter::DirectionType &dir);
705 
706  bool PropagateITKRigid(std::string dataFile, std::string outFile, std::string targetFile, std::string transformFile, InterpolateMode mode);
707  bool PropagateITKAffine(std::string dataFile, std::string outFile, std::string targetFile, std::string transformFile, InterpolateMode mode);
708  bool PropagateITKAffineBspline(std::string inputImage, std::string targetFile, std::string outputFilename, std::string inputTransform, std::string inputBsplineTransform, InterpolateMode mode);
709 
710 
711  // Simple function to convert a string into an array of char
712  // which can be passed as an input for the nifty-reg executables
713  // which have been converted in libraries but still take (int argc, char *argv[]) as input
714  unsigned int StringToCharArray(std::string & cmdline, char ** argument );
715 
716 };
717 
718 } // end namespace milx
719 
720 #endif
void writeFile3D(FixedImageType::Pointer image, std::string outputFileName)
NearestNeighborInterpolatorType::Pointer m_NearestNeighborInterpolator
void SetOutputPrefix(std::string prefix)
std::vector< std::string > GetPropagatedOutputAtlases()
FixedImageType::Pointer readFile3D(std::string fileName)
bool SetCase(int caseID, std::string filenames)
void SetUseConsensus(bool flag)
void SetFilesToSave(int value)
bool LoadSettings(std::string)
std::vector< int > m_AtlasIDs
bool SetAtlases(std::vector< int > atlasIDs, std::vector< std::string > atlasFilenames)
bool SetRegistrationMode(int registrationScheme, std::string configFilename="NULL")
bool RegisterRigidITK(std::string dataFile, std::string atlasFile, std::string outputPrefix, bool Invert, std::string dataMaskFile, std::string atlasMaskFile)
bool ConfigureRegistration(RegistrationMode, std::string)
bool SetConsensusMode(int consensusScheme, std::string configFilename="NULL")
bool SetRegistrationInterpolation(InterpolateMode mode)