[vtkusers] from point cloud to PLY file ??

David Doria daviddoria+vtk at gmail.com
Mon Dec 21 14:35:26 EST 2009


On Mon, Dec 21, 2009 at 12:42 PM, Michele Natrella
<michele.cetma at yahoo.it> wrote:
>
> Hi everybody,
> My name is (Mr) Michele, I am a beginner with VTK.
>
> I am dealing with 3D point clouds (in ascii files). My purpose is to obtain a PLY file. Could anyone give me any hints on the best way to achieve this result?
>
> So far I have been able to obtain a PLY file by using vtkPoints, vtkPolyData, vtkDelaunay2D and vtkPLYWriter. Is this a good procedure?
> If so, I would want to refine my risult by performing an oversampling of my 3D point clouds. Is this feasible with VTK?
>
> Should anyone be interested, as follows the code I wrote (for the moment I have to use the 4.2 version of VTK):
>
>
>
> #include "vtkPolyDataMapper.h"
> #include "vtkProperty.h"
> #include "vtkCamera.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
> #include "vtkDelaunay2D.h"
> #include "vtkPolyData.h"
> #include "vtkOBJExporter.h"
> #include "vtkIVExporter.h"
> #include "vtkPLYWriter.h"
>
> #include <fstream>
> #include <string>
> #include <iostream>
> #include <vector>
> #include <sstream>
> #include <cstdlib>
>
> using namespace std;
>
> std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems);
> std::vector<std::string> split(const std::string &s, char delim);
>
>
>
> int main()
> {
>     vtkPolyData* profile = vtkPolyData::New();
>     vtkPoints* points = vtkPoints::New();
>
> // -1- Apertura file in lettura
>     ifstream fileStream("C:/Documents and Settings/michele.natrella/Desktop/file.txt");
>
>     // -2- Controllo sulla correttezza dell'apertura del file
>     if( !fileStream )
>     {
>         cout << "Impossibile aprire il file " << endl;
>         return 1;
>     }
>
> // -3- Recupero linea per linea e assegnamento valori
>     string line;
>     vector<string> data;
>     float x, y, z; //Punti da inserire
>     while(getline(fileStream, line)) //Prende una nuova linea
>     {
>         if(!line.empty()) // se la linea non è vuota
>         {
>         data=split(line, ' '); //il carattere di separazione  lo spazio
>
>         //Conversione da std::string a float (se si vuole convertire in double sostituire atof con atod)
>         x=(float)atof(data[0].c_str());
>         y=(float)atof(data[1].c_str());
>         z=(float)atof(data[2].c_str());
>
>         points->InsertNextPoint(x, y, z);
>         }
>     }
>
>     profile->SetPoints(points);
>
>     // Perform a 2D Delaunay triangulation on them..
>     vtkDelaunay2D* delny = vtkDelaunay2D::New();
>     delny->SetInput(profile);
>     delny->SetTolerance(0.0001);
>     vtkPolyDataMapper* mapMesh = vtkPolyDataMapper::New();
>     mapMesh->SetInput(delny->GetOutput());
>     vtkActor* meshActor = vtkActor::New();
>     meshActor->SetMapper(mapMesh);
>     meshActor->GetProperty()->SetColor(0.8, 0.8, 0.8);
>
>     // Create the rendering window, renderer, and interactive renderer
>     vtkRenderer* ren = vtkRenderer::New();
>     vtkRenderWindow* renWin = vtkRenderWindow::New();
>     renWin->AddRenderer(ren);
>     vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
>     iren->SetRenderWindow(renWin);
>
>     // Add the actors to the renderer, set the background and size
>     ren->AddActor(meshActor);
>     ren->SetBackground(0, 0, 0);
>     renWin->SetSize(500, 500);
>
>     //write the scene into Ply format
>     vtkPLYWriter* ply = vtkPLYWriter::New();
>     ply->SetInput(delny->GetOutput());
>     ply->SetFileName ("C:/Documents and Settings/michele.natrella/Desktop/file.ply");
>     ply->SetDataByteOrderToBigEndian();
>     ply->Write();
>
>     ren->ResetCamera();
>     ren->GetActiveCamera()->Zoom(1.5);
>
>     // Interact with the data.
>     iren->Initialize();
>     renWin->Render();
>     iren->Start();
>
>     return 0;
> }
>
>
> std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
>     std::stringstream ss(s);
>     std::string item;
>     while(std::getline(ss, item, delim)) {
>         elems.push_back(item);
>     }
>     return elems;
> }
>
> std::vector<std::string> split(const std::string &s, char delim) {
>     std::vector<std::string> elems;
>     return split(s, delim, elems);
> }
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>


Hi Michele,

Welcome to VTK!

Using vtkDelaunay2D is only feasible if the points are a height map -
i.e. they can be projected onto a plane without losing any
relationship information.

I'm assuming by a "ply file" you mean you want a mesh on your points?
If so, here are a couple of examples of doing that:
http://www.cmake.org/Wiki/Create_a_surface_from_Unorganized_Points
http://www.cmake.org/Wiki/Create_a_surface_from_Unorganized_Points_%28Gaussian_Splat%29

I'm curious how you plan to "up sample" your points. If you have a
reasonable idea for doing that, I'd like to turn it into a VTK filter.
Let me know how you were thinking/planning to go about that.

Thanks,

David



More information about the vtkusers mailing list