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® 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