示例#1
0
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);
 }