Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef mitkImageToOpenCVImageFilter_h
00019 #define mitkImageToOpenCVImageFilter_h
00020
00021 #include <mitkCommon.h>
00022 #include <mitkImage.h>
00023 #include <mitkWeakPointer.h>
00024 #include <itkMacro.h>
00025 #include <itkImage.h>
00026 #include <itkRGBPixel.h>
00027 #include <itkImageRegionIterator.h>
00028 #include <cv.h>
00029
00030 #include "mitkOpenCVVideoSupportExports.h"
00031
00032 namespace mitk
00033 {
00034
00040 class MITK_OPENCVVIDEOSUPPORT_EXPORT ImageToOpenCVImageFilter : public itk::Object
00041 {
00042 public:
00043 typedef itk::RGBPixel< unsigned char > UCRGBPixelType;
00044 typedef itk::RGBPixel< unsigned short > USRGBPixelType;
00045 typedef itk::RGBPixel< float > FloatRGBPixelType;
00046 typedef itk::RGBPixel< double > DoubleRGBPixelType;
00047
00048 template <typename TPixel, unsigned int VImageDimension>
00049 static mitk::Image::Pointer ConvertIplToMitkImage( const IplImage * input, bool copyBuffer = true );
00050
00051 mitkClassMacro(ImageToOpenCVImageFilter, itk::Object);
00052 itkNewMacro(ImageToOpenCVImageFilter);
00053
00054 void SetImage( mitk::Image* _Image );
00055 itkGetMacro(Image, mitk::Image*);
00056
00057 bool CheckImage(mitk::Image* image);
00062 IplImage* GetOpenCVImage();
00063
00064 protected:
00065
00066 ImageToOpenCVImageFilter();
00067 virtual ~ImageToOpenCVImageFilter();
00068
00069 template<typename TPixel, unsigned int VImageDimension>
00070 void ItkImageProcessing( itk::Image<TPixel,VImageDimension>* image, int depth );
00071
00072 template<typename TPixel, unsigned int VImageDimension>
00073 void ItkImageProcessing( itk::Image<itk::RGBPixel<TPixel>,VImageDimension>* image, int depth );
00074
00075 protected:
00079 mitk::WeakPointer<mitk::Image> m_Image;
00080 IplImage* m_OpenCVImage;
00081 };
00082
00083 template<typename TPixel, unsigned int VImageDimension>
00084 void mitk::ImageToOpenCVImageFilter::ItkImageProcessing( itk::Image<TPixel,VImageDimension>* image, int depth )
00085 {
00086 typedef itk::Image<TPixel, VImageDimension> ImageType;
00087
00088 const unsigned int numberOfPixels = m_OpenCVImage->width * m_OpenCVImage->height;
00089 const unsigned int numberOfBytes = numberOfPixels * sizeof( typename ImageType::PixelType );
00090
00091 const typename ImageType::PixelType * itkBuffer = image->GetBufferPointer();
00092
00093 typename ImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
00094
00095 m_OpenCVImage = cvCreateImage( cvSize( size[0], size[1] )
00096 , depth, 1 );
00097
00098 memcpy( m_OpenCVImage->imageData, itkBuffer, numberOfBytes );
00099 }
00100
00101 template<typename TPixel, unsigned int VImageDimension>
00102 void mitk::ImageToOpenCVImageFilter::ItkImageProcessing( itk::Image<itk::RGBPixel<TPixel>,VImageDimension>* image, int depth )
00103 {
00104 typedef itk::RGBPixel<TPixel> RGBPixelType;
00105 typedef itk::Image<RGBPixelType, VImageDimension> RGBImageType;
00106 typedef itk::ImageRegionIterator<RGBImageType> RGBIteratorType;
00107
00108 RGBIteratorType it(image, image->GetLargestPossibleRegion());
00109
00110 typename RGBImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();
00111
00112 m_OpenCVImage = cvCreateImage( cvSize( size[0], size[1] ), depth, 3 );
00113
00114 unsigned int x = 0,y = 0;
00115 CvScalar s;
00116 for ( it.GoToBegin(); !it.IsAtEnd(); ++it )
00117 {
00118 s.val[0] = it.Value().GetBlue();
00119 s.val[1] = it.Value().GetGreen();
00120 s.val[2] = it.Value().GetRed();
00121
00122
00123
00124 cvSet2D(m_OpenCVImage,y,x,s);
00125
00126 ++x;
00127
00128 if( x == size[0] )
00129 {
00130 x = 0;
00131 ++y;
00132 }
00133 }
00134
00135 }
00136 }
00137
00138 #endif // mitkImageToOpenCVImageFilter_h
00139
00140