[Insight-users] Euler3DTransform, Rotation Matrix & Initial Parameters - Continued

N.E. Mackenzie Mackay 9nem at qlink.queensu.ca
Fri Jul 16 14:02:16 EDT 2004


Hey Julien

I have just figured out how.  I was applying the transform to a 2 
dimensional plane in the x,y plane.  My last column (z)  was 0's so I 
just replaced the last column with the cross product of the first two 
and everything seems to work fine.

Thanks again,
Neilson
On Jul 15, 2004, at 4:29 PM, Julien Jomier wrote:

> Hi Neilson,
>
> I think it's because your rotation matrix is not orthogonal. You can 
> verify
> this by putting a try/catch around the SetRotationMatrix().
> SetRotationMatrix() is throwing an exception if the matrix is not
> orthogonal.
>
> hope this helps,
>
> Julien
>
>> -----Original Message-----
>> From: insight-users-bounces at itk.org
>> [mailto:insight-users-bounces at itk.org] On Behalf Of N.E.
>> Mackenzie Mackay
>> Sent: Thursday, July 15, 2004 4:21 PM
>> To: Luis Ibanez
>> Cc: insight-users at itk.org
>> Subject: Re: [Insight-users] Euler3DTransform,Rotation Matrix
>> & Initial Parameters - Continued
>>
>>
>> Hey Luis,
>>
>> 	Thanks for the help.
>>
>> 	I tried implementing the code that you sent.  It
>> compiles and builds
>> fine but am having some difficulty at runtime.  It seems to
>> be crashing
>> when I "SetRotationMatrix".  I am not sure why.  Here is a
>> snapshot of
>> my code:
>>
>> 	  TransformType::Pointer transform = TransformType::New();
>>
>> 	  TransformType::OffsetType initialTranslation =
>> transform->GetOffset() ;
>>
>> 	  initialTranslation[0] = 22.1413;
>> 	  initialTranslation[1] = 162.527;
>> 	  initialTranslation[2] = 49.913;
>>
>> 	  transform->SetOffset(initialTranslation);
>>
>> 	  typedef itk::Matrix<double,3,3> MatrixtType ;
>> 	  MatrixtType initialRotation;
>>
>> 	  initialRotation[0][0] = -0.016292;
>> initialRotation[0][1] = 0.098948;
>> initialRotation[0][2] = 0.0;
>> 	  initialRotation[1][0] =
>> 0.00418400;initialRotation[1][1] = 0.007931;
>> initialRotation[1][2] = 0.0;
>> 	  initialRotation[2][0] = -0.095128; initialRotation[2][1] =
>> -0.008306;initialRotation[2][2] = 0.0;
>>
>> 	transform2->SetRotationMatrix(initialRotation);//
>> crashes on this line
>> 	transform2->SetOffset(initialTranslation);
>>
>> 	TransformType::ParametersType initialParameters =
>> transform->GetParameters() ;
>>
>> 	registration->SetInitialTransformParameters(initialParameters);
>>
>> Thanks for the help,
>> Neilson
>>
>> On Jul 14, 2004, at 1:21 PM, Luis Ibanez wrote:
>>
>>>
>>> Hi Neilson,
>>>
>>> The class Euler3DTransform has a method for converting
>>> a 3X3 rotation matrix into the 3 rotaion angles.
>>> Note that from your 4x4 matrix, only the upper left
>>> 3x3 submatrix contains information about rotations.
>>>
>>> http://www.itk.org/Insight/Doxygen/html/
>>> classitk_1_1Euler3DTransform.html
>>>
>>> it is the method
>>>
>>>    ComputeAnglesFromMatrix()
>>>
>>> This is a protected method because you don't really need
>>> to use it. But if you are curious about the implementation
>>> you may want to take a look at the .txx file.
>>>
>>>
>>> Note also that you don't need to do this angle computation
>>> since you can initialize the transform with the 3X3 rotation
>>> matrix and a translation, then call  GetParamters() on the
>>> transform, and finally pass that array of parameters to the
>>> ImageRegistrationMethod.
>>>
>>>
>>> The code will look like:
>>>
>>>
>>>    MatrixType rotation = Extract3by3MatrixFromYours();
>>>    OffsetType translat = Extract3VectorFromYours();
>>>
>>>    euler3DTransform->SetRotationMatrix( rotation );
>>>    euler3DTransform->SetOffset( translat );
>>>
>>>    TransformType::ParametersType parameters =
>>>                         euler3DTransform->GetParameters();
>>>
>>>
>>>    registrationMethod->SetInitialParameters( parameters );
>>>
>>>
>>>
>>>
>>>
>>> Please let us know if you have further questions
>>>
>>>
>>>
>>>   Thanks,
>>>
>>>
>>>
>>>      Luis
>>>
>>>
>>>
>>> -------------------------------
>>> N.E. Mackenzie Mackay wrote:
>>>
>>>> I am trying to initialize Euler3DTransform in order to perform a
>>>> rigid  registration.  I have a rotation matrix that I wish
>> to use to
>>>> initialize the transformation.  After reading
>>>> http://public.kitware.com/pipermail/insight-users/2003-November/
>>>> 005506.html it looks like this is impossible, the only way to
>>>> initialize the transformation is to set angles and translation
>>>> explicitly.
>>>> If this is the case I was wondering if anyone knew a way
>> to extract
>>>> the  3 angles from a 4x4 homogenous matrix?
>>>> Thanks
>>>> Neilson
>>>> _______________________________________________
>>>> Insight-users mailing list
>>>> Insight-users at itk.org
>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>>>
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>>
>



More information about the Insight-users mailing list