在视图中交互 闪退问题
程序闪退
//void mouseEventOccurred(const pcl::visualization::MouseEvent &event,
// void* viewer_void)
//{
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
// if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
// event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
// {
// std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;
//
// char str[512];
// sprintf(str, "text#%03d", text_id++);
// viewer->addText("clicked here", event.getX(), event.getY(), str);
// }
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
//{
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// viewer->addCoordinateSystem(1.0);
//
// viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer);
// viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer);
//
// return (viewer);
//}
这个程序闪退可能有几个原因,我来帮你分析一下:
指针转换问题:
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
这里直接将viewer_void转换为shared_ptr指针可能有风险。建议改为:
boost::shared_ptr<pcl::visualization::PCLVisualizer>* viewer = static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer>*>(viewer_void);
回调函数注册问题:
在interactionCustomizationVis()中,你传入了&viewer的地址,但viewer本身就是一个shared_ptr,这可能导致双重引用。
内存管理问题:
确保在调用这些函数时,返回的viewer被正确持有,不会被过早释放。
PCL版本兼容性:
不同版本的PCL可能在回调处理上有差异,检查你使用的PCL版本文档。
建议修改方案:
void mouseEventOccurred(const pcl::visualization::MouseEvent &event, void* viewer_void)
{
auto viewer = static_cast<pcl::visualization::PCLVisualizer*>(viewer_void);
if(event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
{
std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;
char str[512];
sprintf(str, "text#%03d", text_id++);
viewer->addText("clicked here", event.getX(), event.getY(), str);
}
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
{
auto viewer = boost::make_shared<pcl::visualization::PCLVisualizer>("3D Viewer");
viewer->setBackgroundColor(0, 0, 0);
viewer->addCoordinateSystem(1.0);
viewer->registerKeyboardCallback(keyboardEventOccurred, viewer.get());
viewer->registerMouseCallback(mouseEventOccurred, viewer.get());
return viewer;
}
主要修改点:
直接传递viewer的原始指针(get())给回调函数
使用更安全的boost::make_shared
简化了指针转换逻辑
如果仍有问题,建议:
检查是否有异常抛出
在调试模式下运行,查看崩溃时的调用栈
确保所有PCL依赖项正确安装和链接