【分享】vtk读取有颜色信息的ply,setlookuptable给点云上色例子
vtk吧
全部回复
仅看楼主
level 1
visual_nyb 楼主
刚接触vtk,需要用vtk做三维图像相关显示,看到有其他新人有同样的问题,把代码贴出来,方便入门
void myShow( vtkSmartPointer<vtkActor> anActor)
{
//创建显示窗口
vtkSmartPointer<vtkRenderer> ren1=vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin=vtkSmartPointer<vtkRenderWindow>::New();
ren1->AddActor(anActor);
renWin->AddRenderer(ren1); vtkSmartPointer<vtkRenderWindowInteractor> iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
iren->SetRenderWindow(renWin); renWin->SetSize(1000,1000);
ren1->ResetCamera();
renWin->Render();
iren->Start();
}
//根据点云坐标以及颜色信息,构造vtk中的actor
//参数:点云读取出来的xyz坐标信息 点云读取出来的RGB信息 vtk中的actor
void ply_vtk_actor(vector<Point3d> pointxyz , vector<Point3d> pointrgb, vtkSmartPointer<vtkActor> anActor)
{
int number = pointrgb.size(); //几何数据
vtkSmartPointer<vtkPoints> points=vtkSmartPointer<vtkPoints>::New();
points->SetNumberOfPoints(number); vtkSmartPointer<vtkLookupTable> lut = vtkSmartPointer<vtkLookupTable>::New();
lut->SetNumberOfTableValues(number);
lut->Build(); for(int i = 0; i < number; i++)
{
points->InsertPoint(i , pointxyz[i].x , pointxyz[i].y , pointxyz[i].z);
lut->SetTableValue(i, pointrgb[i].x/255.0, pointrgb[i].y/255.0, pointrgb[i].z/255.0, 1);
} //拓扑数据
vtkSmartPointer<vtkPolyVertex>polyVertex=vtkSmartPointer<vtkPolyVertex>::New();
polyVertex->GetPointIds()->SetNumberOfIds(number);//必须设置Id个数,否则可以编译,不能运行 vtkSmartPointer<vtkFloatArray>pointsScalars=vtkSmartPointer<vtkFloatArray>::New();
pointsScalars->SetNumberOfTuples(number);//此行可有可无 for(int i = 0 ; i < number ; i ++)
{
polyVertex->GetPointIds()->SetId(i , i);//第一个参数是几何point的ID号,第2个参数是拓扑中的Id号
pointsScalars->InsertValue(i , i);//第1个参数是points点的Id,第2个参数是该点的属性值
}
//将以上三部分数据组合成一个结构vtkUnstructureGrid
vtkSmartPointer<vtkUnstructuredGrid> aGrid=vtkSmartPointer<vtkUnstructuredGrid>::New();
aGrid->Allocate(1,1);
aGrid->SetPoints(points);
aGrid->GetPointData()->SetScalars(pointsScalars);
aGrid->InsertNextCell(polyVertex->GetCellType(),polyVertex->GetPointIds()); //设置映射器
vtkSmartPointer<vtkDataSetMapper> aMapper=vtkSmartPointer<vtkDataSetMapper>::New();
aMapper->SetInputData(aGrid);
aMapper->ScalarVisibilityOn(); aMapper->SetScalarRange(0,number-1);
aMapper->SetLookupTable(lut);;
anActor->SetMapper(aMapper);
anActor->GetProperty()->SetRepresentationToPoints(); //anActor->GetProperty()->SetDiffuseColor(1,0,0);
anActor->GetProperty()->SetPointSize(1);
}
//本地读取ply文件并返回根据点坐标以及相应的颜色信息构造的actor
void local_read_ply(string url ,vtkSmartPointer<vtkActor> anActor)
{
vector<Point3d> pointxyz,pointrgb; //这里读取ply相对简单就不贴了,自己封装的函数
PLYFile plyLoadL(url);
plyLoadL.GetPointData(pointxyz);
plyLoadL.GetPointColor(pointrgb); ply_vtk_actor(pointxyz , pointrgb, anActor);
}int main()
{
int number = 0;
float x,y,z;
float r,g,b;
vector<Point3d> pointxyz,pointrgb; vtkSmartPointer<vtkActor> anActor=vtkSmartPointer<vtkActor>::New(); local_read_ply("E:/data/2.ply", anActor);
myShow(anActor);
return 0;
}
2017年05月25日 01点05分 1
level 1
visual_nyb 楼主
贴上来格式有点变化,大家凑合点看吧
2017年05月25日 02点05分 2
level 1
封装的函数也要贴上去呀,后来人拿到不能运行,难受吧
2019年08月07日 02点08分 3
1