[IGSTK-Users] problem with example LandmarkRegistration1

Agata Krasoń agatakrason at gmail.com
Sat Jun 4 13:58:54 EDT 2011


Hello All IGSTK Users and Developpers,

I' m fresh igstk user. I m doing first steps in igstk .
I work with  example LandmarkRegistration1(in Sandbox).
I use Visual Studio 2008.
I need to create dll and link  exe file.
I created dll . It works well. But I have a big problem with linking it with
exe file.
I created  script in CMake.
I attach some of code :

I would to appreciate for any help please.

CMake script :
---------------------------------------------------------------------------------
cmake_minimum_required(VERSION 2.8)

PROJECT(LandmarkDLL)


FIND_PACKAGE(IGSTK)
IF(IGSTK_FOUND)
  INCLUDE(${IGSTK_USE_FILE})
ELSE(IGSTK_FOUND)
  MESSAGE(FATAL_ERROR
          "Cannot build without IGSTK.  Please set IGSTK_DIR.")
ENDIF(IGSTK_FOUND)

FIND_PACKAGE(OpenIGTLink)
IF(OpenIGTLink_FOUND)
  INCLUDE(${OpenIGTLink_USE_FILE})
ELSE(OpenIGTLink_FOUND)
  MESSAGE(FATAL_ERROR
          "Cannot build without OpenIGTLink.  Please set OpenIGTLink_DIR.")
ENDIF(OpenIGTLink_FOUND)



FIND_PACKAGE(IGSTKSandbox)
IF(IGSTKSandbox_FOUND)
  INCLUDE(${IGSTKSandbox_USE_FILE})
ELSE(IGSTKSandbox_FOUND)
  MESSAGE(FATAL_ERROR
          "Cannot build without IGSTK.  Please set IGSTK_DIR.")
ENDIF(IGSTKSandbox_FOUND)

INCLUDE_DIRECTORIES (
  ${IGSTKSandbox_SOURCE_DIR}
  ${IGSTKSandbox_BINARY_DIR}
  ${IGSTKSandbox_SOURCE_DIR}/Source
  ${IGSTKSandbox_BINARY_DIR}/Source
  )


  IF (IGSTKSandbox_USE_CompressedDV)
    SUBDIRS( VideoFrameGrabberAndViewerCompressedDV )
  ENDIF (IGSTKSandbox_USE_CompressedDV)

  IF (IGSTKSandbox_USE_unicap)
    INCLUDE_DIRECTORIES(
    /usr/local/include/unicap
    )
    #SUBDIRS( VideoTemporalCalibrationWizard )
  ENDIF (IGSTKSandbox_USE_unicap)



   if(COMMAND cmake_policy)
      cmake_policy(SET CMP0003 NEW)
    endif(COMMAND cmake_policy)


*ADD_Executable(LandmarkDLL LandmarkDLL.h LandmarkDLL.cxx)*
*TARGET_LINK_LIBRARIES(LandmarkDLL IGSTKSandbox)*
*
*
*
*
*ADD_Executable(MainLandmarkDLL  MainLandmarkDLL.cxx)*
*TARGET_LINK_LIBRARIES(MainLandmarkDLL IGSTKSandbox)*


----------------------------------------------------------------------------------
*LandmarkDLL.h*

*#include <iostream>*
*#include "igstkLandmark3DRegistration.h"*
*#include "igstkLogger.h"*
*#include "itkStdStreamLogOutput.h"*
*#include "itkObject.h"*
*#include "itkCommand.h"*
*#include "itkMacro.h"*
*
*
*#include "igstkEvents.h"*
*#include "igstkTransform.h"*
*#include "igstkCoordinateSystemTransformToResult.h" *
*
*
*
*
*
*
*namespace LandmarkD*
*{*
*
*
*class LandmarkDLL*
*{*
*public:*
*
*
* static __declspec(dllexport) void Rejestracja();*
*
*
*
*
*};*
*}*
*
*
*
-------------------------------------------------------------------------------------
*
*
*
LandmarkDLL.cxx

#include "LandmarkDLL.h"
#include <iostream>

// BeginLatex
//
// To use the registration component, the header file for
// \doxygen{Landmark3DRegistration} is added:
//
// EndLatex

// BeginCodeSnippet
#include "igstkLandmark3DRegistration.h"
// EndCodeSnippet


#include "igstkLogger.h"
#include "itkStdStreamLogOutput.h"
#include "itkObject.h"
#include "itkCommand.h"
#include "itkMacro.h"

// BeginLatex
//
// Transform parameters are returned to the application using loaded
events.
// To handle these events, the following \doxygen{Events}
// and \doxygen{Transform} header files are needed:
//
// EndLatex

// BeginCodeSnippet
#include "igstkEvents.h"
#include "igstkTransform.h"
#include "igstkCoordinateSystemTransformToResult.h"
//#include "LandmarkDLL.h"

using namespace std;
// EndCodeSnippet


// BeginLatex
//
// To fully  utilize the registration component, callbacks need to be set
up
// to observe events that could be thrown by the registration component.
// For this purpose, the ITK command class is used to derive a callback
class.
// The ITK command class implements a subject/observer (command design)
pattern.
// A subject notifies an observer by running the \code{Execute } method of
// the derived callback class. For example, a callback class meant
// to observe an error in the transform computation is defined as follows:
//
// EndLatex

// BeginCodeSnippet
namespace LandmarkD
{
class Landmark3DRegistrationErrorCallback : public itk::Command
{
public:
  typedef Landmark3DRegistrationErrorCallback Self;
  typedef itk::SmartPointer<Self>             Pointer;
  typedef itk::Command                        Superclass;
  itkNewMacro(Self);
  void Execute(const itk::Object * itkNotUsed(caller), const
itk::EventObject & itkNotUsed(event))
    {

    }
  void Execute(itk::Object * itkNotUsed(caller), const itk::EventObject &
itkNotUsed(event))
    {
    std::cerr<<"Error in transform computation"<<std::endl;
    }
protected:
  Landmark3DRegistrationErrorCallback() {};

private:
};
//EndCodeSnippet


class Landmark3DRegistrationInvalidRequestCallback : public itk::Command
{
public:
  typedef Landmark3DRegistrationInvalidRequestCallback Self;
  typedef itk::SmartPointer<Self>                      Pointer;
  typedef itk::Command                                 Superclass;
  itkNewMacro(Self);
  void Execute(const itk::Object * itkNotUsed(caller), const
itk::EventObject & itkNotUsed(event) )
    {

    }
  void Execute(itk::Object * itkNotUsed(caller), const itk::EventObject &
itkNotUsed(event) )
    {
    std::cerr<<"Invalid input request!!"<<std::endl;
    }
protected:
  Landmark3DRegistrationInvalidRequestCallback() {};

private:
};

// BeginLatex
//
// Similarly, a callback class needs to be defined to observe the
// \doxygen{CoordinateSystemTransformToEvent} event. This event is loaded
with
// transform parameters that are computed by the registration component.
 The
// commands are as follows:
// EndLatex

// BeginCodeSnippet
class Landmark3DRegistrationGetTransformCallback: public itk::Command
{
public:
  typedef Landmark3DRegistrationGetTransformCallback    Self;
  typedef itk::SmartPointer<Self>                       Pointer;
  typedef itk::Command                                  Superclass;
  itkNewMacro(Self);

  typedef igstk::CoordinateSystemTransformToEvent TransformEventType;

  void Execute( const itk::Object * itkNotUsed(caller), const
itk::EventObject & itkNotUsed(event) )
    {
    }

  void Execute( itk::Object * itkNotUsed(caller), const itk::EventObject &
event )
    {
    std::cout<< " TransformEvent is thrown" << std::endl;
    const TransformEventType * transformEvent =
      dynamic_cast < const TransformEventType* > ( &event );

    const igstk::CoordinateSystemTransformToResult transformCarrier =
      transformEvent->Get();

    m_Transform = transformCarrier.GetTransform();

    m_EventReceived = true;
    }
  bool GetEventReceived()
    {
    return m_EventReceived;
    }
  igstk::Transform GetTransform()
    {
    return m_Transform;
    }
protected:

  Landmark3DRegistrationGetTransformCallback()
    {
    m_EventReceived = true;
    }

private:
  bool m_EventReceived;
  igstk::Transform m_Transform;
};
// EndCodeSnippet


// BeginLatex
//
// For more information on IGSTK events, see Chapter~\ref{Chapter:Events}.
// After the helper classes are defined, the main function implementation
// is started, as follows:
//
// EndLatex

// BeginCodeSnippet


 void LandmarkDLL::Rejestracja()
{



igstk::RealTimeClock::Initialize();


// BeginLatex
//
// Next, all the necessary data types are defined:
//
// EndLatex

// BeginCodeSnippet
  typedef igstk::Object::LoggerType             LoggerType;
  typedef itk::StdStreamLogOutput               LogOutputType;

  typedef igstk::Landmark3DRegistration
                            Landmark3DRegistrationType;
  typedef igstk::Landmark3DRegistration::LandmarkPointContainerType
                            LandmarkPointContainerType;
  typedef igstk::Landmark3DRegistration::LandmarkImagePointType
                            LandmarkImagePointType;
  typedef igstk::Landmark3DRegistration::LandmarkTrackerPointType
                            LandmarkTrackerPointType;
  typedef Landmark3DRegistrationType::TransformType::OutputVectorType
                            OutputVectorType;
  typedef igstk::Transform  TransformType;
// EndCodeSnippet


// BeginLatex
//
// Then, the registration component is instantiated as follows:
//
// EndLatex

// BeginCodeSnippet
  Landmark3DRegistrationType::Pointer landmarkRegister =
                                        Landmark3DRegistrationType::New();
// EndCodeSnippet


// BeginLatex
//
// Next, the landmark containers that hold the landmark image and tracker
// coordinates are instantiated:
//
// EndLatex

// BeginCodeSnippet
  LandmarkPointContainerType  imagePointContainer;
  LandmarkPointContainerType  trackerPointContainer;
// EndCodeSnippet


  LandmarkImagePointType      imagePoint;
  LandmarkTrackerPointType    trackerPoint;

// BeginLatex
//
// Then, error event callback objects are instantiated and added to the
observer
// list of the registration component, as follows:
//
// EndLatex

// BeginCodeSnippet
  Landmark3DRegistrationInvalidRequestCallback::Pointer
                  lrcb =
Landmark3DRegistrationInvalidRequestCallback::New();

  typedef igstk::InvalidRequestErrorEvent  InvalidRequestEvent;

  landmarkRegister->AddObserver( InvalidRequestEvent(), lrcb );

  Landmark3DRegistrationErrorCallback::Pointer ecb =
                  Landmark3DRegistrationErrorCallback::New();
  typedef igstk::Landmark3DRegistration::TransformComputationFailureEvent

 ComputationFailureEvent;
  landmarkRegister->AddObserver( ComputationFailureEvent(), ecb );

// EndCodeSnippet

// BeginLatex
//
// A logger can then be connected to the registration component for
// debugging purpose, as follows:
//
// EndLatex


// BeginCodeSnippet
  LoggerType::Pointer   logger = LoggerType::New();
  LogOutputType::Pointer logOutput = LogOutputType::New();
  logOutput->SetStream( std::cout );
  logger->AddLogOutput( logOutput );
  logger->SetPriorityLevel( LoggerType::DEBUG );
  landmarkRegister->SetLogger( logger );
// EndCodeSnippet




// BeginCodeSnippet
  // Add 1st landmark
  imagePoint[0] =  25.0;
  imagePoint[1] =  1.0;
  imagePoint[2] =  15.0;
  imagePointContainer.push_back(imagePoint);
  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);

  trackerPoint[0] =  29.8;
  trackerPoint[1] =  -5.3;
  trackerPoint[2] =  25.0;
  trackerPointContainer.push_back(trackerPoint);
  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);

  // Add 2nd landmark
  imagePoint[0] =  15.0;
  imagePoint[1] =  21.0;
  imagePoint[2] =  17.0;
  imagePointContainer.push_back(imagePoint);
  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);

  trackerPoint[0] =  35.0;
  trackerPoint[1] =  16.5;
  trackerPoint[2] =  27.0;
  trackerPointContainer.push_back(trackerPoint);
  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);

  // Add 3d landmark
  imagePoint[0] =  14.0;
  imagePoint[1] =  25.0;
  imagePoint[2] =  11.0;
  imagePointContainer.push_back(imagePoint);
  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);

  trackerPoint[0] =  36.8;
  trackerPoint[1] =  20.0;
  trackerPoint[2] =  21.0;
  trackerPointContainer.push_back(trackerPoint);
  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);

  // EndCodeSnippet

  // BeginLatex
  //
  // More landmarks can be added for the transform computation.
  //
  // EndLatex

  // Add 4th landmark
  imagePoint[0] =  10.0;
  imagePoint[1] =  11.0;
  imagePoint[2] =  8.0;
  imagePointContainer.push_back(imagePoint);
  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);

  trackerPoint[0] =  24.7;
  trackerPoint[1] =  12.0;
  trackerPoint[2] =  18.0;
  trackerPointContainer.push_back(trackerPoint);
  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);

  // BeginLatex
  //
  // After all landmark coordinates are added, the transform computation is
  // requested as follows:
  //
  // EndLatex

  // Calculate transform

  // BeginCodeSnippet
  landmarkRegister->RequestComputeTransform();
  // EndCodeSnippet

  typedef itk::VersorRigid3DTransform<double>
 VersorRigid3DTransformType;
  typedef VersorRigid3DTransformType::ParametersType ParametersType;

  TransformType      transform;
  ParametersType     parameters(6);

  // BeginLatex
  //
  // To access the transform parameters, a GetTransform callback is
instantiated
  // to observe the transform event, as follows:
  //
  // EndLatex

  // BeginCodeSnippet
  Landmark3DRegistrationGetTransformCallback::Pointer lrtcb =
    Landmark3DRegistrationGetTransformCallback::New();

  landmarkRegister->AddObserver(
    igstk::CoordinateSystemTransformToEvent(), lrtcb );
  //EndCodeSnippet


  // BeginLatex
  //
  // To request that the registration component throw an event loaded with
  // transform parameters, a \code{RequestGetTransform} function is invoked
as
  // follows:
  //
  // EndLatex

  // BeginCodeSnippet
  landmarkRegister->RequestGetTransformFromTrackerToImage();
  std::cout << "Transform " << transform << std::cout;
  // EndCodeSnippet


}

}
-------------------------------------------------------------------------------------------------------
MainLandmark.cxx

#include <iostream>
#include "LandmarkDLL.h"
#include "igstkLandmark3DRegistration.h"



#include "igstkLogger.h"
#include "itkStdStreamLogOutput.h"
#include "itkObject.h"
#include "itkCommand.h"
#include "itkMacro.h"
#include "igstkEvents.h"
#include "igstkTransform.h"
#include "igstkCoordinateSystemTransformToResult.h"

using namespace std;

int main()
{

LandmarkD::LandmarkDLL::Rejestracja();
    cout<<" Example LandmarkRegistration1"<<endl;
    system("Pause");
 return 0;
}



-----------------------------------------------

Best,

Agata
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/igstk-users/attachments/20110604/9a263fcb/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: LandmarkDLL.cxx
Type: application/octet-stream
Size: 12103 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/igstk-users/attachments/20110604/9a263fcb/attachment-0004.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: LandmarkDLL.h
Type: text/x-chdr
Size: 439 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/igstk-users/attachments/20110604/9a263fcb/attachment-0002.h>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: MainLandmarkDLL.cxx
Type: application/octet-stream
Size: 5661 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/igstk-users/attachments/20110604/9a263fcb/attachment-0005.obj>


More information about the IGSTK-Users mailing list