VTK结合QT显示单个和多个点云

我的代码主要时将单个和多个点云使用VTK和QT显示,运用QVTKWidget控件。
显示单个点云
//单个点云可视化
void Visualize(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2){
    vtkSmartPointer<vtkPoints> m_points = vtkSmartPointer<vtkPoints>::New();

            for(int i = 0;i < cloud2->points.size();i++)
            {
                m_points->InsertNextPoint(cloud2->points[i].x,cloud2->points[i].y,cloud2->points[i].z);
            }
            m_points2->DeepCopy(m_points);
            std::cout << "可视化点云数量cloud2: " << cloud2->points.size() << std::endl;
            vtkSmartPointer<vtkPolyData> m_data = vtkSmartPointer<vtkPolyData>::New();
            m_data->SetPoints(m_points);
            vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
            m_vertexGlyphFilter->SetInputData(m_data);
            m_vertexGlyphFilter->Update();

        //数据类型转换物体
            vtkSmartPointer<vtkPolyDataMapper> m_dataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
            m_dataMapper->SetInputData(m_vertexGlyphFilter->GetOutput());
            m_dataMapper->Update();
        //演员
            vtkSmartPointer<vtkActor> m_actor = vtkSmartPointer<vtkActor>::New();
        //演员手持物体
            m_actor->SetMapper(m_dataMapper);
            if(color==1){
            m_actor->GetProperty()->SetColor(0, 0, 1);
            }
            else if(color==0){
            m_actor->GetProperty()->SetColor(0, 1, 0);
            }
            else if (color==2){
            m_actor->GetProperty()->SetColor(1, 0, 0);
            }
            m_actor->GetProperty()->SetAmbient(0.5);
            m_actor->GetProperty()->SetPointSize(2);
        //舞台
        vtkSmartPointer<vtkRenderer> m_renderer = vtkRenderer::New();
    //    m_renderer->RemoveAllViewProps();

        //舞台添加演员
        m_renderer->AddActor(m_actor);
        m_renderer->SetBackground(0, 0, 0);//设置背景色
        // 相机
        m_renderer->GetActiveCamera()->SetPosition(0, 0, 1);
        m_renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
        m_renderer->GetActiveCamera()->SetViewUp(0, -1, 0);
        m_renderer->ResetCamera();
        //窗口
        vtkSmartPointer<vtkRenderWindow>  m_renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
        //窗口添加舞台
        m_renderWindow->AddRenderer(m_renderer);
        //设置交互
        vtkSmartPointer<vtkRenderWindowInteractor> m_renderWindowInteractor = pui->qvtkwidget->GetRenderWindow()->GetInteractor();
        std::cout << "可视化点云数量cloud2: " << cloud2->points.size() << std::endl;
        vtkSmartPointer<vtkAreaPicker> areaPicker = vtkSmartPointer<vtkAreaPicker>::New();
        m_renderWindowInteractor->SetPicker(areaPicker);
        vtkSmartPointer<HighlightInteractorStyle> style = vtkSmartPointer<HighlightInteractorStyle>::New();
        style->SetPolyData(m_data);
        style->SetCurrentRenderer(m_renderer);
        m_renderWindowInteractor->SetInteractorStyle(style);
        m_renderWindowInteractor->Initialize();
        m_renderWindowInteractor->SetRenderWindow(m_renderWindow);
        m_renderWindow->SetInteractor(pui->qvtkwidget->GetInteractor());
        //放入qtwidget
        pui->qvtkwidget->SetRenderWindow(m_renderWindow);
        pui->qvtkwidget->GetRenderWindow()->Render();
        m_renderWindowInteractor->Start();

}
显示多个点云
//可视化多个点云
void MultVisualize(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud1,pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2){
    vtkSmartPointer<vtkPoints> result_points = vtkSmartPointer<vtkPoints>::New();
            vtkSmartPointer<vtkPoints> source_points = vtkSmartPointer<vtkPoints>::New();

            for(int i = 0;i < cloud1->points.size();i++)
            {
                result_points->InsertNextPoint(cloud1->points[i].x,cloud1->points[i].y,cloud1->points[i].z);
            }
            for(int i = 0;i < cloud2->points.size();i++)
            {
                source_points->InsertNextPoint(cloud2->points[i].x,cloud2->points[i].y,cloud2->points[i].z);
            }
            std::cout << "点云配准数量cloud_result: " << cloud1->points.size() << std::endl;
            std::cout << "背景点云数量cloud: " << cloud2->points.size() << std::endl;
            //设置数据1
            vtkSmartPointer<vtkPolyData> m_data1 = vtkSmartPointer<vtkPolyData>::New();
            m_data1->SetPoints(result_points);
            vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter1 = vtkSmartPointer<vtkVertexGlyphFilter>::New();
            m_vertexGlyphFilter1->SetInputData(m_data1);
            m_vertexGlyphFilter1->Update();
            //设置数据2
            vtkSmartPointer<vtkPolyData> m_data2 = vtkSmartPointer<vtkPolyData>::New();
            m_data2->SetPoints(source_points);
            vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter2 = vtkSmartPointer<vtkVertexGlyphFilter>::New();
            m_vertexGlyphFilter2->SetInputData(m_data2);
            m_vertexGlyphFilter2->Update();
        //数据类型转换物体1
            vtkSmartPointer<vtkPolyDataMapper> m_dataMapper1 = vtkSmartPointer<vtkPolyDataMapper>::New();
            m_dataMapper1->SetInputData(m_vertexGlyphFilter1->GetOutput());
            m_dataMapper1->Update();
       //数据类型转换物体2
            vtkSmartPointer<vtkPolyDataMapper> m_dataMapper2 = vtkSmartPointer<vtkPolyDataMapper>::New();
            m_dataMapper2->SetInputData(m_vertexGlyphFilter2->GetOutput());
            m_dataMapper2->Update();
        //演员1
            vtkSmartPointer<vtkActor> m_actor1 = vtkSmartPointer<vtkActor>::New();
        //演员1
            vtkSmartPointer<vtkActor> m_actor2 = vtkSmartPointer<vtkActor>::New();
        //演员1手持物体1
            m_actor1->SetMapper(m_dataMapper1);
            m_actor1->GetProperty()->SetColor(0, 1, 0);
            m_actor1->GetProperty()->SetAmbient(0.5);
            m_actor1->GetProperty()->SetPointSize(3);
        //演员2手持物体2
            m_actor2->SetMapper(m_dataMapper2);
            m_actor2->GetProperty()->SetColor(0, 0, 1);
            m_actor2->GetProperty()->SetAmbient(0.5);
            m_actor2->GetProperty()->SetPointSize(2);
        //舞台
        vtkSmartPointer<vtkRenderer> m_renderer = vtkRenderer::New();
    //    m_renderer->RemoveAllViewProps();

        //舞台添加演员
        m_renderer->AddActor(m_actor1);
        m_renderer->AddActor(m_actor2);
        m_renderer->SetBackground(0, 0, 0);//设置背景色
    //    // 相机
    //    m_renderer->GetActiveCamera()->SetPosition(0, 0, 1);
    //    m_renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
    //    m_renderer->GetActiveCamera()->SetViewUp(0, -1, 0);
    //    m_renderer->ResetCamera();
        //窗口
        vtkSmartPointer<vtkRenderWindow>  m_renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
        //窗口添加舞台
        m_renderWindow->AddRenderer(m_renderer);

        m_renderWindow->SetInteractor(pui->qvtkwidget->GetInteractor());
        //放入qtwidget
        pui->qvtkwidget->SetRenderWindow(m_renderWindow);
        pui->qvtkwidget->GetRenderWindow()->Render();
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用QtVTK库来显示点云时,可以使用QVTKWidget类。然而,在某些情况下,可能会遇到undefined reference to `QVTKWidget::QVTKWidget(QWidget*, QFlags<Qt::WindowType>)'的错误。这个错误可能是由于缺少libvtkGUISupportQt库引起的。将libvtkGUISupportQt库添加到项目中可以解决这个问题。 在Qt中可以选择Qt GUI Application来创建带有GUI界面的Qt程序。通过使用Qt Creator中的工具箱,可以很方便地创建和设计GUI界面。 需要注意的是,在Qt Creator的工具箱中,可能没有直接的QVTKWidget类可用。但是,可以通过提升的方式将QVTKWidget类添加到项目中,并使用它来显示点云。但是,同样可能会遇到debug和release模式下的LNK 2019无法解析的外部符号问题。这个问题看起来与Visual Studio中的报错类似。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Qt显示点云文件](https://blog.csdn.net/z_muyangren/article/details/105397727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt 5.9使用VTK显示点云](https://blog.csdn.net/weixin_30735391/article/details/96528253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值