diff --git a/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.cpp b/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.cpp index e83e328077..d3e0279986 100644 --- a/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.cpp +++ b/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.cpp @@ -1,166 +1,167 @@ /*========================================================================= 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 #include #include mitk::OpenCVToMitkImageFilter::OpenCVToMitkImageFilter() -: m_OpenCVImage(0) +: m_OpenCVImage(0), m_CopyBuffer(true) { } 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>=0) && ((unsigned int)m_OpenCVImage->depth == IPL_DEPTH_8S) && (m_OpenCVImage->nChannels == 1) ) - m_Image = ConvertIplToMitkImage< char, 2>( m_OpenCVImage ); + m_Image = ConvertIplToMitkImage< char, 2>( m_OpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 1 ) - m_Image = ConvertIplToMitkImage< unsigned char, 2>( m_OpenCVImage ); + m_Image = ConvertIplToMitkImage< unsigned char, 2>( m_OpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_8U && m_OpenCVImage->nChannels == 3 ) - m_Image = ConvertIplToMitkImage< UCRGBPixelType, 2>( rgbOpenCVImage ); + m_Image = ConvertIplToMitkImage< UCRGBPixelType, 2>( rgbOpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 1 ) - m_Image = ConvertIplToMitkImage< unsigned short, 2>( m_OpenCVImage ); + m_Image = ConvertIplToMitkImage< unsigned short, 2>( m_OpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_16U && m_OpenCVImage->nChannels == 3 ) - m_Image = ConvertIplToMitkImage< USRGBPixelType, 2>( rgbOpenCVImage ); + m_Image = ConvertIplToMitkImage< USRGBPixelType, 2>( rgbOpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 1 ) - m_Image = ConvertIplToMitkImage< float, 2>( m_OpenCVImage ); + m_Image = ConvertIplToMitkImage< float, 2>( m_OpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_32F && m_OpenCVImage->nChannels == 3 ) - m_Image = ConvertIplToMitkImage< FloatRGBPixelType , 2>( rgbOpenCVImage ); + m_Image = ConvertIplToMitkImage< FloatRGBPixelType , 2>( rgbOpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 1 ) - m_Image = ConvertIplToMitkImage< double, 2>( m_OpenCVImage ); + m_Image = ConvertIplToMitkImage< double, 2>( m_OpenCVImage, m_CopyBuffer ); else if( m_OpenCVImage->depth == IPL_DEPTH_64F && m_OpenCVImage->nChannels == 3 ) - m_Image = ConvertIplToMitkImage< DoubleRGBPixelType , 2>( rgbOpenCVImage ); + m_Image = ConvertIplToMitkImage< DoubleRGBPixelType , 2>( rgbOpenCVImage, m_CopyBuffer ); cvReleaseImage(&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 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]; + TPixel * localBuffer = new TPixel[numberOfPixels]; memcpy(localBuffer, input->imageData, numberOfBytes); importFilter->SetImportPointer( localBuffer, numberOfPixels, importImageFilterWillOwnTheBuffer ); - delete[] localBuffer; } 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; } diff --git a/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.h b/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.h index 6722534e3c..f273c86176 100644 --- a/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.h +++ b/Modules/OpenCVVideoSupport/mitkOpenCVToMitkImageFilter.h @@ -1,74 +1,78 @@ /*========================================================================= 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 mitkOpenCVToMitkImageFilter_h #define mitkOpenCVToMitkImageFilter_h #include #include #include #include #include #include #include "mitkOpenCVVideoSupportExports.h" namespace mitk { /** \brief Filter for creating MITK RGB Images from an OpenCV image Last contributor: $Author: mueller $ */ class MITK_OPENCVVIDEOSUPPORT_EXPORT OpenCVToMitkImageFilter : public ImageSource { public: typedef itk::RGBPixel< unsigned char > UCRGBPixelType; typedef itk::RGBPixel< unsigned short > USRGBPixelType; typedef itk::RGBPixel< float > FloatRGBPixelType; typedef itk::RGBPixel< double > DoubleRGBPixelType; template static mitk::Image::Pointer ConvertIplToMitkImage( const IplImage * input, bool copyBuffer = true ); mitkClassMacro(OpenCVToMitkImageFilter, ImageSource); itkNewMacro(OpenCVToMitkImageFilter); itkSetObjectMacro(OpenCVImage, const IplImage); itkGetMacro(OpenCVImage, const IplImage*); + itkSetMacro(CopyBuffer, bool); + itkGetMacro(CopyBuffer, bool); + virtual DataObjectPointer MakeOutput(unsigned int idx); OutputImageType* GetOutput(unsigned int idx); protected: OpenCVToMitkImageFilter(); // purposely hidden virtual ~OpenCVToMitkImageFilter(); virtual void GenerateData(); protected: mitk::Image::Pointer m_Image; const IplImage* m_OpenCVImage; + bool m_CopyBuffer; }; } // namespace #endif // mitkOpenCVToMitkImageFilter_h