[Insight-users] a strange error using itkBSplineDeformableTransform
Chong Zhang
chong.zhang at upf.edu
Tue Apr 3 12:08:45 EDT 2007
Dear users,
I am using itkBSplineDeformableTransform type deformation (three dimension
and BSpline order is 3) to deform the points on a vtkPolyData type mesh. But
the program crashes when I call the method TransformPoint() at one of the
points. (I pasted the code from itkBSplineDeformableTransform.txx below and
underlined the related lines)
template<class TScalarType, unsigned int NDimensions, unsigned int
VSplineOrder>
void
BSplineDeformableTransform<TScalarType, NDimensions,VSplineOrder>
::TransformPoint(
const InputPointType & point,
OutputPointType & outputPoint,
WeightsType & weights,
ParameterIndexArrayType & indices,
bool& inside ) const
{
unsigned int j;
IndexType supportIndex;
InputPointType transformedPoint;
if ( m_BulkTransform )
{
transformedPoint = m_BulkTransform->TransformPoint( point );
}
else
{
transformedPoint = point;
}
if ( m_CoefficientImage[0] )
{
ContinuousIndexType index;
for ( j = 0; j < SpaceDimension; j++ )
{
index[j] = ( point[j] - m_GridOrigin[j] ) / m_GridSpacing[j];
}
// NOTE: if the support region does not lie totally within the grid
// we assume zero displacement and return the input point
inside = this->InsideValidRegion( index );
if ( !inside )
{
outputPoint = transformedPoint;
return;
}
// Compute interpolation weights
m_WeightsFunction->Evaluate( index, weights, supportIndex );
// For each dimension, correlate coefficient with weights
RegionType supportRegion;
supportRegion.SetSize( m_SupportSize );
supportRegion.SetIndex( supportIndex );
outputPoint.Fill( NumericTraits<ScalarType>::Zero );
typedef ImageRegionConstIterator<ImageType> IteratorType;
IteratorType m_Iterator[ SpaceDimension ];
unsigned long counter = 0;
const PixelType * basePointer =
m_CoefficientImage[0]->GetBufferPointer();
for ( j = 0; j < SpaceDimension; j++ )
{
m_Iterator[j] = IteratorType( m_CoefficientImage[j], supportRegion );
}
while ( ! m_Iterator[0].IsAtEnd() )
{
// multiply weigth with coefficient
for ( j = 0; j < SpaceDimension; j++ )
{
outputPoint[j] += static_cast<ScalarType>(
weights[counter] * m_Iterator[j].Get());
}
// populate the indices array
indices[counter] = &(m_Iterator[0].Value()) - basePointer;
// go to next coefficient in the support region
++ counter;
for ( j = 0; j < SpaceDimension; j++ )
{
++( m_Iterator[j] );
}
}
// return results
for ( j = 0; j < SpaceDimension; j++ )
{
outputPoint[j] += transformedPoint[j];
}
}
else
{
itkWarningMacro( << "B-spline coefficients have not been set" );
for ( j = 0; j < SpaceDimension; j++ )
{
outputPoint[j] = transformedPoint[j];
}
}
}
The ContinuousIndex of the point is (4.80, 11.00, 2.97). And the
m_ValidRegionLast (IndexType) is (11, 11, 11). Therefore, the method
InsideValidRegion() gives true (this is suppose to mean the support region
lies totally within the grid). The size of the supportRegion is known
according to the data dimension and BSpline order, which also determine the
length of weights (in my case is 64). The reason for the crashing is: for
some unkown reason, the while loop has been called more than 64 times, and
this results in the access violation of the weights, which is of size 64.
Is there anyone who knows what is happening there?
Best,
Chong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20070403/2e50202c/attachment-0001.htm
More information about the Insight-users
mailing list