[Insight-users] Fast Image Conversion-
David Doria
daviddoria at gmail.com
Tue Feb 8 21:45:59 EST 2011
On Tue, Feb 8, 2011 at 7:54 PM, Ryan L. Smith <ryans09 at gmail.com> wrote:
> Hi David-
>
> Thanks for the quick response. I explored that option, and my software
> compiles although it hangs on execution. The example has an input as an
> array of unsigned chars, as opposed to my vector. Is this the
> problem? Additionally, this still uses an itk to vtk connector before
> display. I am assuming based on your suggestion, the bulk of my time in the
> previous solution was spent looping and setting individual pixels as opposed
> to the itk to vtk filter. Is this correct? If not, is there a vtk import
> filter that will take my buffer as an input directly? My non-functioning
> code hangs when I try to connect my pipeline to an actor, and it is included
> below:
>
> ==================================================================================
> setupCamera();
> getCamInfo(w,h,d) //get width,height,depth from camera
> typedef unsigned char PixelType;
> const unsigned int Dimension = 2;
> typedef itk::Image<PixelType,Dimension> ImageType;
> typedef itk::ImageToVTKImageFilter< ImageType > ConnectorType;
> ConnectorType::Pointer connector = ConnectorType::New();
> typedef itk::Image< PixelType, Dimension > ImageType;
> typedef itk::ImportImageFilter< PixelType, Dimension > ImportFilterType;
> ImportFilterType::Pointer importFilter = ImportFilterType::New();
>
> vtkSmartPointer<vtkImageActor> actor =
> vtkSmartPointer<vtkImageActor>::New();
>
> ImportFilterType::SizeType size;
> size[0] = w;
> size[1] = h; // size along Y
>
> ImportFilterType::IndexType start;
> start.Fill( 0 );
>
> ImportFilterType::RegionType region;
> region.SetIndex( start );
> region.SetSize( size );
> importFilter->SetRegion( region );
>
> double origin[ Dimension ];
> origin[0] = 0.0; // X coordinate
> origin[1] = 0.0; // Y coordinate
> importFilter->SetOrigin( origin );
>
> double spacing[ Dimension ];
> spacing[0] = 1.0; // along X direction
> spacing[1] = 1.0; // along Y direction
>
> importFilter->SetSpacing( spacing );
>
> const int numberOfPixels = size[0] * size[1];
>
> ConnectorType::Pointer connector = ConnectorType::New();
>
>
>
> UINT32_TYPE SizeInBytes = h*w*3*((depth+7)/8);
>
> std::vector<
>
> unsigned char> ImageData(SizeInBytes);
>
> UINT32_OUT_TYPE pnFrameCount ;
>
> Result = UCC_GetBitmap8ImageEx( CamId, &*ImageData.begin(), pnFrameCount ,
> 6000, NULL ) ;
>
> const bool importImageFilterWillOwnTheBuffer = true;
>
> importFilter->SetImportPointer( &*ImageData.begin(), numberOfPixels,
>
> importImageFilterWillOwnTheBuffer );
>
> connector->SetInput(importFilter->GetOutput());
>
> actor->SetInput(connector->GetOutput()); // THIS LINE MAKES MY CODE HANG
>
>
> ====================================================================================
>
>
>
> Thanks in advance for your help!
> -Ryan
>
>
> On Tue, Feb 8, 2011 at 1:55 PM, David Doria <daviddoria at gmail.com> wrote:
>>
>> On Tue, Feb 8, 2011 at 4:52 PM, Ryan L. Smith <ryans09 at gmail.com> wrote:
>> >
>> > Hi-
>> > I am reading in an image stream in unsigned char vector format from a
>> > camera in real-time. I have some code setup to display the image using
>> > VTK/ITK, but the latencies are high. Is there a method to directly convert
>> > this vector to a VTK image? I am currently looping through and setting the
>> > image pixels in an ITK image using the following example:
>> > http://www.vtk.org/Wiki/ITK/Examples/SimpleOperations/SetPixels
>> > I then connect the pipeline using itk::ImageToVTKImageFilter and display
>> > the image. I recognize this is an inefficient way of doing things, but came
>> > up blank in looking for an optimized function to do it for me. Thanks in
>> > advance-
>> > -Ryan
>>
>> Have you seen the ImportImageFilter ?
>> http://www.itk.org/Wiki/ITK/Examples/IO/ImportImageFilter
>>
>> David
>
>
I'm not sure why your code would freeze - I'll leave that to someone else.
There is also vtkImageImport :
http://www.vtk.org/Wiki/VTK/Examples/Cxx/Broken/Images/ImageImport
(I'm not sure of the status of that example - if it doesn't work,
please fix it :) )
which may get you directly to where you want to go.
David
More information about the Insight-users
mailing list