[vtkusers] Having problems importing data to vtk from itk/vnl
Arne Hansen
bsd.diverse at gmail.com
Mon Jan 15 13:37:46 EST 2007
Hello. I created the matrices in matlab and saved them to a binary file. I
then use vnl to manipulate these matrices on the fly in vtk.
I made it work now, by first importing the data into itk, and then connect
it to vtk using the provided connectPipelines() function.
I don't know what the error was, but it had something to do with the
importfilter, since this is where the data went wrong.
Thank you for your answers.
2007/1/15, Luis Ibanez <luis.ibanez at kitware.com>:
>
>
> Hi Arne,
>
>
> You may want to check your program in several intermediate locations.
>
>
> 1) Inside the method "importData()" you should check writing
> out the vtkImageData in a .vtk file and then open it using
> ParaView (www.paraview.org). This will verify if the import
> process work well or not.
>
>
> 2) If (1) works fine, then you should try wrting out the vtkImageData
> just after returning from the importData() function. This will
> verify if there is any reference counting issue that may have
> deleted your image when returning from the function.
>
>
> 3) What exactly are you trying to import ?
> Is this an image that you created with ITK ?
> From your email, it seems that you are importing a matrix
> that you created with vnl...
>
> How did you created that file ?
> Did you created the file in the same machine ?
> (e.g. can you discard endianness problems ?)
>
>
> Please let us know
>
>
> Thanks
>
>
> Luis
>
>
>
> ------------------
> Arne Hansen wrote:
> > Hello all. I am (still) having problems getting my data correct read
> > into vtk. I have a really strange problem which i absolutely dont
> > understand. I read in the data from binary files...that goes well. Then
> > i put it into a vnl_matrix(goes also well) and extract a certain part of
> > this matrix, import this subpart into a vtkImageData with 3 dimensions
> > using the itkImageImport class.
> > When i then try to use this image data, the application crashes because
> > the data has not been put there correctly is my assumption.
> > When i call the print() function for the vtkImageData object it tells me
> > that there are the 97*110*129 = 1376430 which there should be. The
> > GetEstimatedMemorySize() and GetActualMemorySize() also returns more or
> > less the correct amount in kb. To check that the values of data is
> > correct I have tried calling GetDataScalarPointer() to get access to the
> > data kept inside this object.
> > When i then iterate this data in my unique(...) function(my own, see
> > below), and print the values, it seems that at position 344107 it
> > assumes value -4.2e037, and thereafter -9.1e041and followed by zeros up
> > until index 345072 where the application crashes.
> > And it should be able to print out 1376430 elements, since this is the
> > size of the image.
> >
> > Furthermore, the application crashes if i try to render the image.
> >
> > So I was hoping someone with a bit more experience with me could take a
> > quick look at my code and see if it looks completely wrong. I am really
> > stuck here, and I dont understand why the data is not there, when it
> > should be, and vtk actually tells me that it is there.
> >
> > I have copied my program listing below for ease of understanding my
> > problem. I really hope for help since i am pretty stuck here.
> > Thank you very much in advance
> > - H
> >
> > #include<cstdio>
> > #include <fstream>
> > #include <vtkImageData.h>
> > #include "vtkImageImport.h" //Import images for VTK
> > #include "vtkActor.h"
> > #include "vtkOutlineFilter.h "
> > #include "vtkPolyDataMapper.h"
> > #include "vtkRenderWindow.h"
> > #include "vtkRenderer.h"
> > #include "vtkRenderWindowInteractor.h"
> > #include "vtkLight.h"
> > #include "vtkCamera.h"
> > #include "vtkContourFilter.h"
> > #include "vtkProperty.h"
> >
> > #include<map>
> > #include <vnl/vnl_matrix.h>
> >
> > typedef float SDMdatatype;
> > typedef vnl_matrix<SDMdatatype> mat;
> >
> > int D[]={110,129,97};
> > unsigned int N=((*D)*(*(D+1))*(*(D+2))); //numel(vol)
> > unsigned short m=1; //Shape count
> > unsigned short sm=7; //Significant modes chosen
> > mat meanShape(N*m,1);
> >
> > SDMdatatype* readArrayFromFile(char* fn,long size){
> > std::ifstream file;
> > file.open(fn,std::ios::in|std::ios::binary);
> > if (!file) { printf("file was not opened, issue error msg"); }
> > SDMdatatype* buffer;
> > buffer = new SDMdatatype[size];
> > file.read(reinterpret_cast<char*>(buffer), sizeof (SDMdatatype) *
> > size);//static_cast <char *> buffer
> > file.close();
> > return buffer;
> > }
> >
> > vtkImageData* importData(SDMdatatype *data1,int *dims){
> > vtkImageImport *importer = vtkImageImport::New();
> > importer->SetDataScalarTypeToFloat();
> > importer->SetDataOrigin(0,0,0);
> > //importer->SetImportVoidPointer(data1);
> > importer->CopyImportVoidPointer(data1,N);
> >
> > importer->SetWholeExtent(0,dims[0]-1,0,dims[1]-1,0,dims[2]-1);//If not
> > 3D image set 3D extent = 0.
> > importer->SetDataExtentToWholeExtent();
> >
> > importer->Update();
> >
> > vtkImageData *img=importer->GetOutput();
> > img->Update();
> > return img;
> > }
> >
> > void loadPCAResults(){
> > SDMdatatype* b1=readArrayFromFile(
> > "C:\\thesisIntermediate\\meanshape.dat",
> > N*m);
> >
> > meanShape.copy_in(b1);
> > delete b1;
> > }
> > void unique(SDMdatatype* data, int size,bool print){
> > typedef std::map<SDMdatatype,long> pixHistType;
> > pixHistType hist;
> >
> > for(int k=0;k<size;k++){
> > //printf("%x\n",data[k]);
> > std::cout<<k<<" : "<<*(data+k)<<std::endl;
> > SDMdatatype val=data[k];
> > //mexPrintf("%4i\n",val);
> > hist[val]++;
> > }
> > if(print){
> > pixHistType::iterator iter;
> > for(iter = hist.begin(); iter != hist.end(); ++iter)
> > std::cout<<"["<<iter->first<<"]:["<<iter->second<<"]"<<std::endl;
> > }
> > }
> >
> > int main(int argc,char* argv[])
> > {
> > loadPCAResults();
> >
> > //structure actors
> > vtkActor *Temporopolar_region_left_actor = vtkActor::New();
> >
> > //rendering objects
> > vtkRenderer *aRenderer = vtkRenderer::New();
> > vtkRenderWindow *renWin = vtkRenderWindow::New();
> > vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
> > vtkCamera *aCamera = vtkCamera::New();
> >
> > // Get vols from SDM
> > //extract(height,width,top,left)
> > mat t=meanShape.extract(N,1, 0,0);
> > SDMdatatype* b=t.data_block();
> > vtkImageData *Temporopolar_region_left_data = importData(b,D);
> >
> > Temporopolar_region_left_data->Update();
> > Temporopolar_region_left_data->UpdateInformation();
> > Temporopolar_region_left_data->PropagateUpdateExtent();
> >
> > SDMdatatype* a =
> > (SDMdatatype*)Temporopolar_region_left_data->GetScalarPointer();
> >
> > unique(a,N,1);
> >
> > vtkContourFilter *contours = vtkContourFilter::New();
> > contours->SetInput(Temporopolar_region_left_data);
> > contours->SetValue(0,0);
> >
> > vtkPolyDataMapper *mpr = vtkPolyDataMapper::New();
> > mpr->SetInput(contours->GetOutput());
> >
> > Temporopolar_region_left_actor -> SetMapper(mpr);
> > Temporopolar_region_left_actor -> GetProperty() -> SetDiffuseColor(1.,
> > 0., 0.);
> > Temporopolar_region_left_actor -> GetProperty() ->
> SetSpecularPower(50);
> > Temporopolar_region_left_actor -> GetProperty() -> SetSpecular(0.5);
> > Temporopolar_region_left_actor -> GetProperty() -> SetDiffuse( 0.8);
> >
> > // Actors are added to the renderer.
> > aRenderer->AddActor(Temporopolar_region_left_actor);
> >
> > iren->SetRenderWindow(renWin);
> > renWin->AddRenderer(aRenderer);
> > aRenderer->SetActiveCamera(aCamera);
> >
> > // Setting the color and size of the renderwindow,
> > // initializing the camera position
> >
> > // Here we go!
> > iren->Initialize();
> > renWin->Render();
> > iren->Start();
>
> > //////////////////////////////////////////////////////////////////////////////////
> > // CLEAN UP //
>
> > //////////////////////////////////////////////////////////////////////////////////
> >
> >
> > aCamera->Delete();
> > aRenderer->Delete();
> > renWin->Delete();
> > iren->Delete();
> > }
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > This is the private VTK discussion list.
> > Please keep messages on-topic. Check the FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20070115/6b487ea2/attachment.htm>
More information about the vtkusers
mailing list