Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "cmtkImagePairAffineRegistrationFunctionalDevice.h"
00034
00035 #include <GPU/cmtkImagePairAffineRegistrationFunctionalDevice_kernels.h>
00036
00037 namespace
00038 cmtk
00039 {
00040
00043
00044 ImagePairAffineRegistrationFunctionalDevice::ImagePairAffineRegistrationFunctionalDevice
00045 ( UniformVolume::SmartConstPtr& fixedVolume, UniformVolume::SmartConstPtr& movingVolume )
00046 : ImagePairRegistrationFunctional( fixedVolume, movingVolume ),
00047 m_FixedVolumeOnDevice( DeviceUniformVolumeArray::Create( *(fixedVolume) ) ),
00048 m_MovingVolumeOnDevice( DeviceUniformVolumeArray::Create( *(movingVolume) ) )
00049 {
00050 }
00051
00052 ImagePairAffineRegistrationFunctionalDevice::ReturnType
00053 ImagePairAffineRegistrationFunctionalDevice::Evaluate()
00054 {
00055 const AffineXform::MatrixType xformMatrix;
00056
00057 float matrix[4][4];
00058 for ( size_t j = 0; j < 4; ++j )
00059 {
00060 for ( size_t i = 0; i < 4; ++i )
00061 {
00062 matrix[j][i] = static_cast<float>( xformMatrix[j][i] );
00063 }
00064 }
00065
00066 FixedVector<3,float> deltas = this->m_ReferenceGrid->Deltas();
00067
00068
00069 for ( size_t j = 0; j < 3; ++j )
00070 {
00071 for ( size_t i = 0; i < 3; ++i )
00072 {
00073 matrix[j][i] *= deltas[j];
00074 }
00075 }
00076
00077
00078 for ( size_t j = 0; j < 4; ++j )
00079 {
00080 for ( size_t i = 0; i < 3; ++i )
00081 {
00082 matrix[j][i] /= this->m_FloatingGrid->Size[i];
00083 }
00084 }
00085
00086 return -ImagePairAffineRegistrationFunctionalDeviceEvaluateMSD( this->m_ReferenceGrid->m_Dims.begin(), this->m_FixedVolumeOnDevice->GetDeviceArrayPtr()->GetArrayOnDevice(),
00087 this->m_FloatingGrid->m_Dims.begin(), this->m_MovingVolumeOnDevice->GetDeviceArrayPtr()->GetArrayOnDevice(), matrix );
00088 }
00089
00090 }