Hi all,

When compiling MITK with OpenCV support I've got a lot of compile errors.
This compile errors may be don't occurs in other platforms, but I
don't have others to test.
Basically some template methods have some type instantiations without
typename keyword. The files with the typenames are attached, since are
only two, I think a diff will be the sufficient to see the problem.

Regards,

Wagner Sales
/*=========================================================================

Program:   Medical Imaging & Interaction Toolkit
Language:  C++
Date:      $Date: 2010-01-28 18:32:03 +0100 (Do, 28 Jan 2010) $
Version:   $Revision: 21147 $

Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.

This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#ifndef mitkImageToOpenCVImageFilter_h
#define mitkImageToOpenCVImageFilter_h

#include <mitkCommon.h>
#include <mitkImage.h>
#include <mitkWeakPointer.h>
#include <itkMacro.h>
#include <itkImage.h>
#include <itkRGBPixel.h>
#include <itkImageRegionIterator.h>
#include <cv.h>

#include "mitkOpenCVVideoSupportExports.h"

namespace mitk
{

/**
  \brief A pseudo-Filter for creating OpenCV images from MITK images with the option of copying data or referencing it

  Last contributor: $Author: mueller $
*/
  class MITK_OPENCVVIDEOSUPPORT_EXPORT ImageToOpenCVImageFilter : public itk::Object
{
  public:
    typedef itk::RGBPixel< unsigned char > UCRGBPixelType;
    typedef itk::RGBPixel< unsigned short > USRGBPixelType;
    typedef itk::RGBPixel< float > FloatRGBPixelType;
    typedef itk::RGBPixel< double > DoubleRGBPixelType;

    template <typename TPixel, unsigned int VImageDimension> 
    static mitk::Image::Pointer ConvertIplToMitkImage( const IplImage * input, bool copyBuffer = true );

    mitkClassMacro(ImageToOpenCVImageFilter, itk::Object);
    itkNewMacro(ImageToOpenCVImageFilter);

    void SetImage( mitk::Image* _Image );
    itkGetMacro(Image, mitk::Image*);

    bool CheckImage(mitk::Image* image);
    ///
    /// Get the produced OpenCVImage.
    /// ATTENTION: Do not forget to release this image again with cvReleaseImage().
    ///
    IplImage* GetOpenCVImage();

  protected:

    ImageToOpenCVImageFilter(); // purposely hidden
    virtual ~ImageToOpenCVImageFilter();

    template<typename TPixel, unsigned int VImageDimension>
    void ItkImageProcessing( itk::Image<TPixel,VImageDimension>* image, int depth );

    template<typename TPixel, unsigned int VImageDimension>
    void ItkImageProcessing( itk::Image<itk::RGBPixel<TPixel>,VImageDimension>* image, int depth );

  protected:
    ///
    /// Saves if the filter should copy the data or just reference it
    ///
    mitk::WeakPointer<mitk::Image> m_Image;
    IplImage* m_OpenCVImage;
};

  template<typename TPixel, unsigned int VImageDimension>
  void mitk::ImageToOpenCVImageFilter::ItkImageProcessing( itk::Image<TPixel,VImageDimension>* image, int depth )
  {
    typedef itk::Image<TPixel, VImageDimension> ImageType;

    const unsigned int numberOfPixels = m_OpenCVImage->width * m_OpenCVImage->height;
    const unsigned int numberOfBytes = numberOfPixels * sizeof( typename ImageType::PixelType );

    const typename ImageType::PixelType * itkBuffer = image->GetBufferPointer();

    typename ImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
    // create new opencv image
    m_OpenCVImage = cvCreateImage( cvSize( size[0], size[1] )
      , depth, 1 );

    memcpy( m_OpenCVImage->imageData, itkBuffer, numberOfBytes );
  }

  template<typename TPixel, unsigned int VImageDimension>
  void mitk::ImageToOpenCVImageFilter::ItkImageProcessing( itk::Image<itk::RGBPixel<TPixel>,VImageDimension>* image, int depth )
  {
    typedef itk::RGBPixel<TPixel> RGBPixelType;
    typedef itk::Image<RGBPixelType, VImageDimension> RGBImageType;
    typedef itk::ImageRegionIterator<RGBImageType> RGBIteratorType;

    RGBIteratorType it(image, image->GetLargestPossibleRegion());

    typename RGBImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
    // create new opencv image
    m_OpenCVImage = cvCreateImage( cvSize( size[0], size[1] ), depth, 3 );

    unsigned int x = 0,y = 0;
    CvScalar s;
    for ( it.GoToBegin(); !it.IsAtEnd(); ++it ) 
    {
      s.val[0] = it.Value().GetBlue();
      s.val[1] = it.Value().GetGreen();
      s.val[2] = it.Value().GetRed();
      
      //MITK_DEBUG << "[" << x << "," << y << "] " << s.val[0] << "(B)," << s.val[1] << "(G)," << s.val[2] << "(R)";

      cvSet2D(m_OpenCVImage,y,x,s);

      ++x;
      // next line found
      if( x == size[0] )
      {
        x = 0;
        ++y;
      }
    }

  }
} // namespace

#endif // mitkImageToOpenCVImageFilter_h


/*=========================================================================
 
Program:   Medical Imaging & Interaction Toolkit
Language:  C++
Date:      $Date: 2010-01-14 14:20:26 +0100 (Do, 14 Jan 2010) $
Version:   $Revision: 21047 $
 
Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.
 
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.  See the above copyright notices for more information.
 
=========================================================================*/

#include "mitkOpenCVToMitkImageFilter.h"

#include <itkImportImageFilter.h>
#include <itkRGBPixel.h>
#include <mitkITKImageImport.txx>

mitk::OpenCVToMitkImageFilter::OpenCVToMitkImageFilter()
: m_OpenCVImage(0)
{
}

mitk::OpenCVToMitkImageFilter::~OpenCVToMitkImageFilter()
{
}

void mitk::OpenCVToMitkImageFilter::GenerateData()
{
  if(m_OpenCVImage == 0)
  {
    MITK_WARN << "Cannot not start filter. OpenCV Image not set.";
    return;
  }

  // convert to rgb image color space
  IplImage* rgbOpenCVImage = cvCreateImage( cvSize( m_OpenCVImage->width, m_OpenCVImage->height )
    , m_OpenCVImage->depth, m_OpenCVImage->nChannels );

  if( m_OpenCVImage->nChannels == 3)
    cvCvtColor( m_OpenCVImage, rgbOpenCVImage,  CV_BGR2RGB );

  // now convert rgb image
  if( m_OpenCVImage->depth == IPL_DEPTH_8S && m_OpenCVImage->nChannels == 1 )
    m_Image = ConvertIplToMitkImage< char, 2>( m_OpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 1 )
    m_Image = ConvertIplToMitkImage< unsigned char, 2>( m_OpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 3 )
    m_Image = ConvertIplToMitkImage< UCRGBPixelType, 2>( rgbOpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 1 )
    m_Image = ConvertIplToMitkImage< unsigned short, 2>( m_OpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 3 )
    m_Image = ConvertIplToMitkImage< USRGBPixelType, 2>( rgbOpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 1 )
    m_Image = ConvertIplToMitkImage< float, 2>( m_OpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 3 )
    m_Image = ConvertIplToMitkImage< FloatRGBPixelType , 2>( rgbOpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 1 )
    m_Image = ConvertIplToMitkImage< double, 2>( m_OpenCVImage );

  else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 3 )
    m_Image = ConvertIplToMitkImage< DoubleRGBPixelType , 2>( rgbOpenCVImage );
}

mitk::ImageSource::DataObjectPointer mitk::OpenCVToMitkImageFilter::MakeOutput( unsigned int idx )
{
  return Superclass::MakeOutput(idx);
}

mitk::ImageSource::OutputImageType* mitk::OpenCVToMitkImageFilter::GetOutput( unsigned int idx )
{
  return m_Image;
}

/********************************************
* Converting from OpenCV image to ITK Image
*********************************************/
template <typename TPixel, unsigned int VImageDimension>
mitk::Image::Pointer mitk::OpenCVToMitkImageFilter::ConvertIplToMitkImage( const IplImage * input, bool copyBuffer )
{
  mitk::Image::Pointer mitkImage(0);

  typedef itk::Image< TPixel, VImageDimension > ItkImage;

  typedef itk::ImportImageFilter< TPixel, VImageDimension >  ImportFilterType;
  typename ImportFilterType::Pointer importFilter = ImportFilterType::New();

  typename ImportFilterType::SizeType  size;

  size[0]  = input->width;
  size[1]  = input->height;

  typename ImportFilterType::IndexType start;
  start.Fill( 0 );

  typename ImportFilterType::RegionType region;
  region.SetIndex( start );
  region.SetSize(  size  );

  importFilter->SetRegion( region );


  double origin[ VImageDimension ];
  origin[0] = 0.0;    // X coordinate
  origin[1] = 0.0;    // Y coordinate

  importFilter->SetOrigin( origin );


  double spacing[ VImageDimension ];
  spacing[0] = 1.0;    // along X direction
  spacing[1] = 1.0;    // along Y direction

  importFilter->SetSpacing( spacing );


  const unsigned int numberOfPixels = size[0] * size[1];
  const unsigned int numberOfBytes = numberOfPixels * sizeof( TPixel );

  if( copyBuffer )
  {
    const bool importImageFilterWillOwnTheBuffer = false;

    TPixel * localBuffer = new TPixel[numberOfPixels];

    memcpy(localBuffer, input->imageData, numberOfBytes);

    importFilter->SetImportPointer( localBuffer, numberOfPixels,
      importImageFilterWillOwnTheBuffer );
  }
  else
  {
    const bool importImageFilterWillOwnTheBuffer = false;

    TPixel * localBuffer = reinterpret_cast< TPixel * >( input->imageData );

    importFilter->SetImportPointer( localBuffer, numberOfPixels,
      importImageFilterWillOwnTheBuffer );
  }

  importFilter->Update();

  typename ItkImage::Pointer output = importFilter->GetOutput();

  output->DisconnectPipeline();

  mitkImage = mitk::ImportItkImage( output );

  return mitkImage;
} 
------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
mitk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to