- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 VTK 来显示点云并循环更新它。窗口可以通过鼠标进行交互第一次 我显示云,如果我想更新云,我必须按“q”,窗口将显示更新的云。然而,虽然云已更新并正确显示在窗口中,但我失去了对窗口的控制(即无法使用鼠标在窗口中移动或旋转点云)。
以下是我重现问题的最少代码。我有一个可视化类来处理这个,它的初始化列表:
points(vtkSmartPointer<vtkPoints>::New())
, vertices(vtkSmartPointer<vtkCellArray>::New())
, pointsPolyData(vtkSmartPointer<vtkPolyData>::New())
, mapper(vtkSmartPointer<vtkPolyDataMapper>::New())
, actor(vtkSmartPointer<vtkActor>::New())
, renderer(vtkSmartPointer<vtkRenderer>::New())
, renderWindow(vtkSmartPointer<vtkRenderWindow>::New())
, renderWindowInteractor(vtkSmartPointer<vtkRenderWindowInteractor>::New())
这是init函数:
void Visualization::init(const cv::Mat &point_cloud){
noPoints = point_cloud.cols * point_cloud.rows;
// Preallocate memory
points->SetNumberOfPoints(noPoints);
// Copy
int element_stripe = sizeof(float) * point_cloud.channels();
for (unsigned i = 0; i < noPoints; i++)
{
float x = point_cloud.at<cv::Vec3f>(i)[0];
float y = point_cloud.at<cv::Vec3f>(i)[1];
float z = point_cloud.at<cv::Vec3f>(i)[2];
vtkIdType pid[1] = {i};
points->SetPoint(i, x, y, z);
vertices->InsertNextCell(1, pid);
}
// Push data to polydata
pointsPolyData->SetPoints(points);
pointsPolyData->SetVerts(vertices);
// Set visualization pipeline
mapper->SetInputData(pointsPolyData);
actor->SetMapper(mapper);
actor->GetProperty()->SetPointSize(2);
renderWindow->AddRenderer(renderer);
renderer->SetBackground(.3,.6,.3);
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
isPipelineInit = true;
renderWindow->Render();
renderWindowInteractor->Start();
}
这是显示函数:
void Visualization::display(const cv::Mat &point_cloud){
if(!isPipelineInit)
init(point_cloud);
else
{
// Copy
int element_stripe = sizeof(float) * point_cloud.channels();
for (unsigned i = 0; i < noPoints; i++)
{
points->SetPoint(i, (float*)(point_cloud.data + i*element_stripe));
}
pointsPolyData->Modified();
mapper->Update();
renderWindowInteractor->GetRenderWindow()->Render();
}
}
我还有一个在线程中运行无限循环的函数:
void Visualization::run()
{
while (1) // infinite while loop
{
// Update m_clouds and display
display(m_clouds);
}
}
更新:正如 mirni 提醒我的那样,'q' 键实际上退出了当前的 renderWindow,我后来看到的实际上是来自 display
函数而不是 init
。在 display
中,我没有调用 renderWindowInteractor->Start()
,因此无法与窗口交互。但是,renderWindowInteractor->Start()
卡住了我的当前线程,因此我无法继续我的程序并更新我的 vtkPolyData。
我想问题会变成:如何同时显示和更新?我应该在不同的线程中执行此操作,一个用于显示,另一个用于更新吗?
谢谢!
最佳答案
你的问题的答案是:你只需更新数据并调用 vtkRenderWindow::Render()
方法。 VTK 渲染管道自行发现数据已更改并且需要更新。
您的代码确实需要重新设计——在数据更改时(仅一次)更新可视化更有意义,而不是继续探测数据“有什么变化吗?” (每毫秒)。
此外,通常您不需要为 VTK 可视化管道创建单独的线程。保持简单:
display(...)
方法重命名为void Visualization::update(const cv::Mat &point_cloud);
将其公开并在数据以适合您的场景的任何方式更改时从外部调用它(回调?Qt 信号?消息?...)。确保在最后保留 vtkRenderWindow::Render() 调用。
您可能需要考虑直接从 cv::Mat 结构复制数据,使用指向由 vtkPoints::GetVoidPointer(int)
公开的点数据的原始指针并执行 memcopy而不是 for 循环,但是在您准备就绪并且您的测量显示需要优化之前不要这样做。 (过早的优化是根源...)
vtkRenderWindowInteractor::Start()
启动事件循环并在您发现时劫持线程。无需调用 Start()
,只需调用 Initialize()
即可启用交互器,但让控制流继续进行。
喂,米罗
关于c++ - VTK - 在不阻塞交互的情况下更新 renderWindow 中的 vtkPolyData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417197/
问题:有没有办法直接访问 vtkPolyData 结构中的特定单元格? 我正在使用 vtkPolyData 来存储行集,比如 L。 目前,我正在使用 GetLines() 来了解 L 中的行数。然后,
我已经设法从 vtk 中的设定点创建了一个曲面。现在我需要通过表面切割一个平面并制作一个 2D 轮廓,我可以将其输出为 vtkImageData。我制作的代码只能投影到平面上。谁能告诉我通过多数据获取
我的 VTK 程序使用 vtkCubeAxesActor 在坐标系中绘制一个 vtkPolyData 对象 surface1。我按以下方式定位立方体轴: cubeAxesActor->SetBound
我正在尝试通过使用 vtkTransform 来转换 vtkPolyData 对象。但是,我找到的教程使用的是管道,例如:http://www.vtk.org/Wiki/VTK/Examples/Cx
我正在尝试编辑 vtkPolyData 中的一个点。 我尝试了两种方法: 使用GetPoint 和SetPoint 方法直接修改点(可行) 使用 GetCell 访问单元格,然后使用 GetPoint
我有一组折线:oldData。我希望仅显示基于“过滤器”的这些折线中的一些:showLine: void myFunction(vtkSmartPointer oldData,
我是 VTK 的新手。我正在尝试在 python 中使用 VTK 来使用 vtkBoxWidget 编辑 .STL 文件。我正在读取 .STL 文件,通过在窗口交互器中使用鼠标/拖动,使用 vtkBo
我正在使用以下代码来填充点云:How to display point cloud in vtk in different colors? 这些点是新西兰现在地震的经度、纬度和深度。 我想更改点的大小
给定一个 vtk 图像: vtkSmartPointer VTKImage = vtkSmartPointer::New(); 这是一个包含分割结果作为二进制数据的 3D 图像(分割对象 = 1,背景
我使用 VTK 来显示点云并循环更新它。窗口可以通过鼠标进行交互第一次 我显示云,如果我想更新云,我必须按“q”,窗口将显示更新的云。然而,虽然云已更新并正确显示在窗口中,但我失去了对窗口的控制(即无
我正在尝试从 mlab.contour3d 图中获取三角化的 vtkPolyData。我使用 mayavi 因为它似乎是获取 minimal surfaces 的最快方法正确三角测量。我需要它作为 v
我想将 vtkPolyData 保存到数据库中,让我知道如何做我按照下面的示例(它创建了一些点,然后将它们导出到 vtp 文件) #include #include #include #incl
意图 我编写了一个 VTK 应用程序,它使用 vtkPoints > vtkPolyLine > vtkPolyData > vtkPolyDataMapper 生成螺旋并显示它。如果在程序初始化时静
我是一名优秀的程序员,十分优秀!