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 #include "mitkOpenCVToMitkImageFilter.h"
00019
00020 #include <itkImportImageFilter.h>
00021 #include <itkRGBPixel.h>
00022 #include <mitkITKImageImport.txx>
00023
00024 mitk::OpenCVToMitkImageFilter::OpenCVToMitkImageFilter()
00025 : m_OpenCVImage(0)
00026 {
00027 }
00028
00029 mitk::OpenCVToMitkImageFilter::~OpenCVToMitkImageFilter()
00030 {
00031 }
00032
00033 void mitk::OpenCVToMitkImageFilter::GenerateData()
00034 {
00035 if(m_OpenCVImage == 0)
00036 {
00037 MITK_WARN << "Cannot not start filter. OpenCV Image not set.";
00038 return;
00039 }
00040
00041
00042 IplImage* rgbOpenCVImage = cvCreateImage( cvSize( m_OpenCVImage->width, m_OpenCVImage->height )
00043 , m_OpenCVImage->depth, m_OpenCVImage->nChannels );
00044
00045 if( m_OpenCVImage->nChannels == 3)
00046 cvCvtColor( m_OpenCVImage, rgbOpenCVImage, CV_BGR2RGB );
00047
00048
00049 if( (m_OpenCVImage->depth>=0) && ((unsigned int)m_OpenCVImage->depth == IPL_DEPTH_8S) && (m_OpenCVImage->nChannels == 1) )
00050 m_Image = ConvertIplToMitkImage< char, 2>( m_OpenCVImage );
00051
00052 else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 1 )
00053 m_Image = ConvertIplToMitkImage< unsigned char, 2>( m_OpenCVImage );
00054
00055 else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 3 )
00056 m_Image = ConvertIplToMitkImage< UCRGBPixelType, 2>( rgbOpenCVImage );
00057
00058 else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 1 )
00059 m_Image = ConvertIplToMitkImage< unsigned short, 2>( m_OpenCVImage );
00060
00061 else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 3 )
00062 m_Image = ConvertIplToMitkImage< USRGBPixelType, 2>( rgbOpenCVImage );
00063
00064 else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 1 )
00065 m_Image = ConvertIplToMitkImage< float, 2>( m_OpenCVImage );
00066
00067 else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 3 )
00068 m_Image = ConvertIplToMitkImage< FloatRGBPixelType , 2>( rgbOpenCVImage );
00069
00070 else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 1 )
00071 m_Image = ConvertIplToMitkImage< double, 2>( m_OpenCVImage );
00072
00073 else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 3 )
00074 m_Image = ConvertIplToMitkImage< DoubleRGBPixelType , 2>( rgbOpenCVImage );
00075 }
00076
00077 mitk::ImageSource::DataObjectPointer mitk::OpenCVToMitkImageFilter::MakeOutput( unsigned int idx )
00078 {
00079 return Superclass::MakeOutput(idx);
00080 }
00081
00082 mitk::ImageSource::OutputImageType* mitk::OpenCVToMitkImageFilter::GetOutput( unsigned int )
00083 {
00084 return m_Image;
00085 }
00086
00087
00088
00089
00090 template <typename TPixel, unsigned int VImageDimension>
00091 mitk::Image::Pointer mitk::OpenCVToMitkImageFilter::ConvertIplToMitkImage( const IplImage * input, bool copyBuffer )
00092 {
00093 mitk::Image::Pointer mitkImage(0);
00094
00095 typedef itk::Image< TPixel, VImageDimension > ItkImage;
00096
00097 typedef itk::ImportImageFilter< TPixel, VImageDimension > ImportFilterType;
00098 typename ImportFilterType::Pointer importFilter = ImportFilterType::New();
00099
00100 typename ImportFilterType::SizeType size;
00101
00102 size[0] = input->width;
00103 size[1] = input->height;
00104
00105 typename ImportFilterType::IndexType start;
00106 start.Fill( 0 );
00107
00108 typename ImportFilterType::RegionType region;
00109 region.SetIndex( start );
00110 region.SetSize( size );
00111
00112 importFilter->SetRegion( region );
00113
00114
00115 double origin[ VImageDimension ];
00116 origin[0] = 0.0;
00117 origin[1] = 0.0;
00118
00119 importFilter->SetOrigin( origin );
00120
00121
00122 double spacing[ VImageDimension ];
00123 spacing[0] = 1.0;
00124 spacing[1] = 1.0;
00125
00126 importFilter->SetSpacing( spacing );
00127
00128
00129 const unsigned int numberOfPixels = size[0] * size[1];
00130 const unsigned int numberOfBytes = numberOfPixels * sizeof( TPixel );
00131
00132 if( copyBuffer )
00133 {
00134 const bool importImageFilterWillOwnTheBuffer = false;
00135
00136 TPixel * localBuffer = new TPixel[numberOfPixels];
00137
00138 memcpy(localBuffer, input->imageData, numberOfBytes);
00139
00140 importFilter->SetImportPointer( localBuffer, numberOfPixels,
00141 importImageFilterWillOwnTheBuffer );
00142 }
00143 else
00144 {
00145 const bool importImageFilterWillOwnTheBuffer = false;
00146
00147 TPixel * localBuffer = reinterpret_cast< TPixel * >( input->imageData );
00148
00149 importFilter->SetImportPointer( localBuffer, numberOfPixels,
00150 importImageFilterWillOwnTheBuffer );
00151 }
00152
00153 importFilter->Update();
00154
00155 typename ItkImage::Pointer output = importFilter->GetOutput();
00156
00157 output->DisconnectPipeline();
00158
00159 mitkImage = mitk::ImportItkImage( output );
00160
00161 return mitkImage;
00162 }