int main(int argc, char **argv) { std::cout<<"Usage: GetHOG3D image.vtk mesh.vtp label_array_name output_hog.csv output_label.csv radius"<<std::endl; // const char* inputImageFileName = "/home/costa/Dropbox/code/HOG3D/bin/01D-LGE-320.vtk"; // const char* inputMeshFileName = "/home/costa/Dropbox/code/HOG3D/bin/01D_320_autolabels.vtp"; // const char* outputHogFileName = "/home/costa/Dropbox/code/HOG3D/bin/01D_320_hog.csv"; // const char* outputLabelsFileName = "/home/costa/Dropbox/code/HOG3D/bin/01D_320_lbl.csv"; // const char* labelArrayName = "autolabels"; if(argc<6) return EXIT_FAILURE; int c=1; const char* inputImageFileName = argv[c++]; const char* inputMeshFileName = argv[c++]; const char* labelArrayName = argv[c++]; const char* outputHogFileName = argv[c++]; const char* outputLabelsFileName = argv[c++]; float radius = atof(argv[c++]); const int ngrad_bins = 8; //number of gradient orientation bins //define some region of interest around the point arma::vec radii; radii << radius; //mm //---------------------------------------------------- // // // read the image // // typedef unsigned int PixelType; typedef itk::Image< PixelType, 3 > ImageType; typedef itk::ImageFileReader< ImageType > ImageReaderType; typename ImageReaderType::Pointer imageReader = ImageReaderType::New(); imageReader->SetFileName(inputImageFileName); try { imageReader->Update(); } catch (itk::ExceptionObject& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; } // // //---------------------------------------------------- //---------------------------------------------------- // // read the mesh // // // vtkSmartPointer<vtkXMLPolyDataReader> rd = vtkSmartPointer<vtkXMLPolyDataReader>::New(); rd->SetFileName(inputMeshFileName); rd->Update(); vtkPolyData* mesh = rd->GetOutput(); //calculate normals vtkSmartPointer<vtkPolyDataNormals> ng = vtkSmartPointer<vtkPolyDataNormals>::New(); ng->SetInputData(mesh); ng->SplittingOff(); ng->Update(); vtkDataArray* pnormals = ng->GetOutput()->GetPointData()->GetNormals(); // // //---------------------------------------------------- //---------------------------------------------------- // // save the labels // // // std::cout<<"Saving the labels"<<std::endl; vtkDataArray* mesh_labels = mesh->GetPointData()->GetArray(labelArrayName); arma::uvec labels(mesh_labels->GetNumberOfTuples()); for(int i=0; i<mesh_labels->GetNumberOfTuples(); i++) { labels(i) = mesh_labels->GetTuple1(i); } labels.save(outputLabelsFileName, arma::raw_ascii); // // //---------------------------------------------------- //---------------------------------------------------- // // for each point of the mesh, take normal and // for each scale (radius+sigma) get the HOG // // // //create the matrix to store everything //every row - HOGS of one point std::cout<<"Calculating HOGs"<<std::endl; //sample something to know the size of the neighborhood double pt[3]; mesh->GetPoint(0, pt); arma::ivec samples; SampleGradHistogram<ImageType>(pt, radii[0], imageReader->GetOutput(), samples); arma::imat sample_matrix(mesh->GetNumberOfPoints(), samples.size()); const int nsamples = samples.size(); // for(int j=0; j<radii.size(); j++) { std::cout<<"Radius "<<radii[j]<<std::endl; for(int i=0; i<mesh->GetNumberOfPoints(); i++) { if(i%1000==0) std::cout<<"Point "<<i<<"/"<<mesh->GetNumberOfPoints()<<"\r"<<std::flush; double pt[3]; mesh->GetPoint(i, pt); SampleGradHistogram<ImageType>(pt, radii[j], imageReader->GetOutput(), samples); if(nsamples!=samples.size()) std::cout<<std::endl<<"Nonconstant number of samples (vertex "<<i<<"): "<<nsamples<<" vs "<<samples.size()<<std::endl<<std::flush; //copy the histogram into the matrix for(int k=0; k<samples.size(); k++) { sample_matrix(i,k) = samples(k); } } std::cout<<std::endl; } // // //---------------------------------------------------- std::cout<<std::endl<<"Saving"<<std::endl; //save the matrix sample_matrix.save(outputHogFileName, arma::arma_binary); // return EXIT_SUCCESS; }
shared_ptr<arma::mat> sample_matrix(gsl_rng* rng) { return sample_matrix(rng, all_examples); }