MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkKinectReconstructionTest.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
13#include <mitkTestingMacros.h>
15
16#include <mitkImage.h>
17#include <mitkImagePixelReadAccessor.h>
18#include <mitkSurface.h>
20#include <mitkNumericTypes.h>
22#include <mitkIOUtil.h>
23
24#include <vtkPoints.h>
25#include <vtkPolyData.h>
26#include <vtkSmartPointer.h>
27
33int mitkKinectReconstructionTest(int argc , char* argv[])
34{
35 MITK_TEST_BEGIN("mitkKinectReconstructionTest");
36
37 MITK_TEST_CONDITION_REQUIRED(argc > 2, "Testing if enough arguments are set.");
38 std::string calibrationFilePath(argv[1]);
39 std::string kinectImagePath(argv[2]);
40
41 mitk::ToFDistanceImageToSurfaceFilter::Pointer distToSurf = mitk::ToFDistanceImageToSurfaceFilter::New();
42 mitk::CameraIntrinsics::Pointer intrinsics = mitk::CameraIntrinsics::New();
43 //load our personal kinect calibration
44 intrinsics->FromXMLFile(calibrationFilePath);
45 MITK_TEST_CONDITION_REQUIRED(intrinsics.IsNotNull(), "Testing if a calibration file could be loaded.");
46 distToSurf->SetCameraIntrinsics(intrinsics);
47 distToSurf->SetReconstructionMode(mitk::ToFDistanceImageToSurfaceFilter::Kinect);
48 //load a data set
49 mitk::Image::Pointer kinectImage = mitk::IOUtil::Load<mitk::Image>(kinectImagePath);
50 MITK_TEST_CONDITION_REQUIRED(kinectImage.IsNotNull(), "Testing if a kinect image could be loaded.");
51 distToSurf->SetInput(kinectImage);
52 distToSurf->Update();
53
54 mitk::Surface::Pointer resultOfFilter = distToSurf->GetOutput();
55 MITK_TEST_CONDITION_REQUIRED(resultOfFilter.IsNotNull(), "Testing if any output was generated.");
56 mitk::PointSet::Pointer resultPointSet = mitk::ToFTestingCommon::VtkPolyDataToMitkPointSet(resultOfFilter->GetVtkPolyData());
57
58 // generate ground truth data
59 mitk::PointSet::Pointer groundTruthPointSet = mitk::PointSet::New();
61 focalLength[0] = intrinsics->GetFocalLengthX();
62 focalLength[1] = intrinsics->GetFocalLengthY();
64 principalPoint[0] = intrinsics->GetPrincipalPointX();
65 principalPoint[1] = intrinsics->GetPrincipalPointY();
66
67 int xDimension = (int)kinectImage->GetDimension(0);
68 int yDimension = (int)kinectImage->GetDimension(1);
69 int pointCount = 0;
70 mitk::ImagePixelReadAccessor<float,2> imageAcces(kinectImage, kinectImage->GetSliceData(0));
71 for (int j=0; j<yDimension; j++)
72 {
73 for (int i=0; i<xDimension; i++)
74 {
75 itk::Index<2> pixel;
76 pixel[0] = i;
77 pixel[1] = j;
78
79 mitk::ToFProcessingCommon::ToFScalarType distance = (double)imageAcces.GetPixelByIndex(pixel);
80
81 mitk::Point3D currentPoint;
82 currentPoint = mitk::ToFProcessingCommon::KinectIndexToCartesianCoordinates(i,j,distance,focalLength[0],focalLength[1],principalPoint[0],principalPoint[1]);
83
84 if (distance>mitk::eps)
85 {
86 groundTruthPointSet->InsertPoint( pointCount, currentPoint );
87 pointCount++;
88 }
89 }
90 }
91 MITK_TEST_CONDITION_REQUIRED( mitk::ToFTestingCommon::PointSetsEqual(resultPointSet,groundTruthPointSet),
92 "Testing if point sets are equal (with a small epsilon).");
93 MITK_TEST_END();
94}
itk::Point< ToFScalarType, 2 > ToFPoint2D
static ToFProcessingCommon::ToFPoint3D KinectIndexToCartesianCoordinates(unsigned int i, unsigned int j, ToFScalarType distance, ToFScalarType focalLengthX, ToFScalarType focalLengthY, ToFScalarType principalPointX, ToFScalarType principalPointY)
KinectIndexToCartesianCoordinates Convert a pixel (i,j) with value d to a 3D world point....
static mitk::PointSet::Pointer VtkPolyDataToMitkPointSet(vtkSmartPointer< vtkPolyData > poly)
VtkPolyDataToMitkPointSet Converts a vtkPolyData into an mitkPointSet.
static bool PointSetsEqual(mitk::PointSet::Pointer pointSet1, mitk::PointSet::Pointer pointSet2)
PointSetsEqual Method two test if two point sets contain the same points. mitk::Equal is used for com...
int mitkKinectReconstructionTest(int argc, char *argv[])
mitkKinectReconstructionTest Testing method for the Kinect reconstruction mode. Specially meant for K...