NifTK  16.4.1 - 0798f20
CMIC's Translational Medical Imaging Platform
niftkNiftyCalVideoCalibrationManager.h
Go to the documentation of this file.
1 /*=============================================================================
2 
3  NifTK: A software platform for medical image computing.
4 
5  Copyright (c) University College London (UCL). All rights reserved.
6 
7  This software is distributed WITHOUT ANY WARRANTY; without even
8  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9  PURPOSE.
10 
11  See LICENSE.txt in the top level directory for details.
12 
13 =============================================================================*/
14 
15 #ifndef niftkNiftyCalVideoCalibrationManager_h
16 #define niftkNiftyCalVideoCalibrationManager_h
17 
18 #include "niftkNiftyCalExports.h"
19 #include <itkObject.h>
20 #include <itkObjectFactoryBase.h>
21 #include <mitkDataStorage.h>
22 #include <mitkDataNode.h>
23 #include <mitkPointSet.h>
24 #include <niftkPointUtilities.h>
25 #include <niftkIPoint2DDetector.h>
26 #include <cv.h>
27 #include <list>
28 
29 namespace niftk
30 {
31 
39 class NIFTKNIFTYCAL_EXPORT NiftyCalVideoCalibrationManager : public itk::Object
40 {
41 public:
42 
44  {
45  // Order must match that in niftk::CameraCalViewPreferencePage
50  TEMPLATE_MATCHING_RINGS
51  };
52 
54  {
55  // Order must match that in niftk::CameraCalViewPreferencePage
59  NON_LINEAR_EXTRINSIC
60  };
61 
62  const static bool DefaultDoIterative;
63  const static bool DefaultDo3DOptimisation;
65  const static double DefaultScaleFactorX;
66  const static double DefaultScaleFactorY;
67  const static unsigned int DefaultGridSizeX;
68  const static unsigned int DefaultGridSizeY;
72  const static unsigned int DefaultMinimumNumberOfPoints;
73  const static bool DefaultUpdateNodes;
74 
75  mitkClassMacroItkParent(NiftyCalVideoCalibrationManager, itk::Object);
77 
78  void SetDataStorage(const mitk::DataStorage::Pointer storage);
79 
80  void SetLeftImageNode(mitk::DataNode::Pointer node);
81  mitk::DataNode::Pointer GetLeftImageNode() const;
82 
83  void SetRightImageNode(mitk::DataNode::Pointer node);
84  mitk::DataNode::Pointer GetRightImageNode() const;
85 
86  void SetTrackingTransformNode(mitk::DataNode::Pointer node);
87  itkGetMacro(TrackingTransformNode, mitk::DataNode::Pointer);
88 
89  itkSetMacro(ReferenceTrackingTransformNode, mitk::DataNode::Pointer);
90  itkGetMacro(ReferenceTrackingTransformNode, mitk::DataNode::Pointer);
91 
92  itkSetMacro(MinimumNumberOfSnapshotsForCalibrating, unsigned int);
93  itkGetMacro(MinimumNumberOfSnapshotsForCalibrating, unsigned int);
94 
95  itkSetMacro(DoIterative, bool);
96  itkGetMacro(DoIterative, bool);
97 
98  itkSetMacro(Do3DOptimisation, bool);
99  itkGetMacro(Do3DOptimisation, bool);
100 
101  itkSetMacro(UpdateNodes, bool);
102  itkGetMacro(UpdateNodes, bool);
103 
104  itkSetMacro(ScaleFactorX, double);
105  itkGetMacro(ScaleFactorX, double);
106 
107  itkSetMacro(ScaleFactorY, double);
108  itkGetMacro(ScaleFactorY, double);
109 
110  itkSetMacro(GridSizeX, unsigned int);
111  itkGetMacro(GridSizeX, unsigned int);
112 
113  itkSetMacro(GridSizeY, unsigned int);
114  itkGetMacro(GridSizeY, unsigned int);
115 
116  itkSetMacro(MinimumNumberOfPoints, unsigned int);
117  itkGetMacro(MinimumNumberOfPoints, unsigned int);
118 
119  itkSetMacro(CalibrationPattern, CalibrationPatterns);
120  itkGetMacro(CalibrationPattern, CalibrationPatterns);
121 
122  itkSetMacro(HandeyeMethod, HandEyeMethod);
123  itkGetMacro(HandeyeMethod, HandEyeMethod);
124 
125  itkSetMacro(TagFamily, std::string);
126  itkGetMacro(TagFamily, std::string);
127 
128  void SetModelFileName(const std::string& fileName);
129  itkGetMacro(ModelFileName, std::string);
130 
131  void SetOutputDirName(const std::string& dirName);
132  itkGetMacro(OutputDirName, std::string);
133 
134  void SetReferenceDataFileNames(const std::string& imageFileName,
135  const std::string& pointsFileName);
136  itkGetMacro(ReferenceImageFileName, std::string);
137  itkGetMacro(ReferencePointsFileName, std::string);
138 
139  void SetTemplateImageFileName(const std::string& fileName);
140  itkGetMacro(TemplateImageFileName, std::string);
141 
142  void SetModelToTrackerFileName(const std::string& fileName);
143  itkGetMacro(ModelToTrackerFileName, std::string);
144 
145  unsigned int GetNumberOfSnapshots() const;
146 
151  void Restart();
152 
157  bool Grab();
158 
162  void UnGrab();
163 
172  double Calibrate();
173 
178  void Save();
179 
184  void UpdateCameraToWorldPosition();
185 
190  void LoadCalibrationFromDirectory(const std::string& dirName);
191 
192 protected:
193 
194  NiftyCalVideoCalibrationManager(); // Purposefully hidden.
195  virtual ~NiftyCalVideoCalibrationManager(); // Purposefully hidden.
196 
197  NiftyCalVideoCalibrationManager(const NiftyCalVideoCalibrationManager&); // Purposefully not implemented.
198  NiftyCalVideoCalibrationManager& operator=(const NiftyCalVideoCalibrationManager&); // Purposefully not implemented.
199 
200 private:
201 
205  void ConvertImage(mitk::DataNode::Pointer imageNode, cv::Mat& outputImage);
206 
213  bool ExtractPoints(int imageIndex, const cv::Mat& image);
214 
218  std::list<cv::Matx44d> ExtractCameraMatrices(int imageIndex);
219 
223  std::list<cv::Matx44d> ExtractTrackingMatrices(bool useReference);
224 
228  std::vector<cv::Mat> ConvertMatrices(const std::list<cv::Matx44d>& list);
229 
233  cv::Matx44d DoTsaiHandEye(int imageIndex, bool useReference);
234 
238  cv::Matx44d DoShahidiHandEye(int imageIndex, bool useReference);
239 
243  cv::Matx44d DoMaltiHandEye(int imageIndex, bool useReference);
244 
248  cv::Matx44d DoFullExtrinsicHandEye(int imageIndex, bool useReference);
249 
254  void DoFullExtrinsicHandEyeInStereo(cv::Matx44d& leftHandEye, cv::Matx44d& rightHandEye, bool useReference);
255 
259  void UpdateVisualisedPoints(cv::Matx44d& transform);
260 
264  void SaveImages(const std::string& prefix,
265  const std::list<std::pair<std::shared_ptr<niftk::IPoint2DDetector>, cv::Mat> >&
266  );
267 
271  void SavePoints(const std::string& prefix, const std::list<niftk::PointSet>& points);
272 
277  void SetIntrinsicsOnImage(const cv::Mat& intrinsics,
278  const cv::Mat& distortion,
279  const std::string& propertyName,
280  mitk::DataNode::Pointer image);
281 
291  void SetStereoExtrinsicsOnImage(const cv::Mat& leftToRightRotationMatrix,
292  const cv::Mat& leftToRightTranslationVector,
293  const std::string& propertyName,
294  mitk::DataNode::Pointer image
295  );
296 
301  void UpdateDisplayNodes();
302 
303  typedef mitk::GenericProperty<itk::Matrix<float, 4, 4> > MatrixProperty;
304 
305  // Data from Plugin/DataStorage.
306  mitk::DataStorage::Pointer m_DataStorage;
307  mitk::DataNode::Pointer m_ImageNode[2];
308  mitk::DataNode::Pointer m_TrackingTransformNode;
309  mitk::DataNode::Pointer m_ReferenceTrackingTransformNode;
310 
311  // Data from preferences.
312  bool m_DoIterative;
313  bool m_Do3DOptimisation;
314  unsigned int m_MinimumNumberOfSnapshotsForCalibrating;
315  std::string m_ModelFileName;
316  double m_ScaleFactorX;
317  double m_ScaleFactorY;
318  unsigned int m_GridSizeX;
319  unsigned int m_GridSizeY;
320  CalibrationPatterns m_CalibrationPattern;
321  HandEyeMethod m_HandeyeMethod;
322  std::string m_TagFamily;
323  std::string m_OutputDirName;
324  std::string m_ModelToTrackerFileName;
325  std::string m_ReferenceImageFileName;
326  std::string m_ReferencePointsFileName;
327  bool m_UpdateNodes;
328  unsigned int m_MinimumNumberOfPoints;
329  std::string m_TemplateImageFileName;
330  std::string m_CalibrationDirName;
331 
332  // Data used for temporary storage
333  cv::Mat m_TmpImage[2];
334 
335  // Data used for calibration.
336  cv::Size2i m_ImageSize;
337  std::pair< cv::Mat, niftk::PointSet> m_ReferenceDataForIterativeCalib;
338  cv::Mat m_TemplateImage;
339  cv::Matx44d m_ModelToTracker;
340  niftk::Model3D m_ModelPoints;
341  mitk::PointSet::Pointer m_ModelPointsToVisualise;
342  mitk::DataNode::Pointer m_ModelPointsToVisualiseDataNode;
343  std::list<niftk::PointSet> m_Points[2];
344  std::list<
345  std::pair<
346  std::shared_ptr<niftk::IPoint2DDetector>,
347  cv::Mat>
348  > m_OriginalImages[2];
349  std::list<
350  std::pair<
351  std::shared_ptr<niftk::IPoint2DDetector>,
352  cv::Mat>
353  > m_ImagesForWarping[2];
354  std::list<cv::Matx44d> m_TrackingMatrices;
355  std::vector<mitk::DataNode::Pointer> m_TrackingMatricesDataNodes;
356  std::list<cv::Matx44d> m_ReferenceTrackingMatrices;
357 
358  // Calibration result
359  cv::Mat m_Intrinsic[2];
360  cv::Mat m_Distortion[2];
361  std::vector<cv::Mat> m_Rvecs[2];
362  std::vector<cv::Mat> m_Tvecs[2];
363  cv::Mat m_EssentialMatrix;
364  cv::Mat m_FundamentalMatrix;
365  cv::Mat m_LeftToRightRotationMatrix;
366  cv::Mat m_LeftToRightTranslationVector;
367  std::vector<cv::Matx44d> m_HandEyeMatrices[2];
368  std::vector<cv::Matx44d> m_ReferenceHandEyeMatrices[2];
369  cv::Matx44d m_ModelToWorld;
370 
371 }; // end class
372 
373 } // end namespace
374 
375 #endif
static const std::string DefaultTagFamily
Definition: niftkNiftyCalVideoCalibrationManager.h:71
GLenum GLsizei GLenum GLenum const GLvoid * image
Definition: glew.h:4052
mitk::GenericProperty< itk::Matrix< float, 4, 4 > > MatrixProperty
Definition: niftkSurfaceReconstruction.h:39
static const HandEyeMethod DefaultHandEyeMethod
Definition: niftkNiftyCalVideoCalibrationManager.h:70
static const double DefaultScaleFactorY
Definition: niftkNiftyCalVideoCalibrationManager.h:66
static const CalibrationPatterns DefaultCalibrationPattern
Definition: niftkNiftyCalVideoCalibrationManager.h:69
Definition: niftkNiftyCalVideoCalibrationManager.h:46
GLuint GLenum GLenum transform
Definition: glew.h:12775
Definition: niftkNiftyCalVideoCalibrationManager.h:49
static const double DefaultScaleFactorX
Definition: niftkNiftyCalVideoCalibrationManager.h:65
Definition: niftkNiftyCalVideoCalibrationManager.h:47
Definition: niftkNiftyCalVideoCalibrationManager.h:56
Definition: niftkNiftyCalVideoCalibrationManager.h:58
static const bool DefaultDoIterative
Definition: niftkNiftyCalVideoCalibrationManager.h:62
GLuint GLdouble GLdouble GLint GLint const GLdouble * points
Definition: glew.h:3085
CalibrationPatterns
Definition: niftkNiftyCalVideoCalibrationManager.h:43
static const unsigned int DefaultMinimumNumberOfPoints
Definition: niftkNiftyCalVideoCalibrationManager.h:72
Manager class to perform video calibration as provided by NiftyCal.
Definition: niftkNiftyCalVideoCalibrationManager.h:39
HandEyeMethod
Definition: niftkNiftyCalVideoCalibrationManager.h:53
Definition: niftkNiftyCalVideoCalibrationManager.h:48
static const unsigned int DefaultGridSizeX
Definition: niftkNiftyCalVideoCalibrationManager.h:67
static const unsigned int DefaultGridSizeY
Definition: niftkNiftyCalVideoCalibrationManager.h:68
Definition: niftkNiftyCalVideoCalibrationManager.h:57
Definition: niftkExceptionObject.h:21
GLsizei const GLcharARB ** string
Definition: glew.h:5194
static const unsigned int DefaultMinimumNumberOfSnapshotsForCalibrating
Definition: niftkNiftyCalVideoCalibrationManager.h:64
static const bool DefaultUpdateNodes
Definition: niftkNiftyCalVideoCalibrationManager.h:73
static const bool DefaultDo3DOptimisation
Definition: niftkNiftyCalVideoCalibrationManager.h:63