ny1986 2024-04-14 16:49 采纳率: 0%
浏览 132
已结题

C#和C++混合编程,使用CLR托管,报错System.Runtime.InteropServices.SEHException

C#和C++混合编程,使用CLR托管,在C++代码中使用了PCL点云库来处理点云数据,程序运行到利用PCL进行平面分割时报错。
整个程序读入的是点云,出错部分代码如下:

//平面分割,寻找芯片大平面
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>);
        {
            //创建分割时所需要的模型系数对象coefficients以及存储内点的点索引集合对象
            pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
            pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
            //创建分割对象
            pcl::SACSegmentation<pcl::PointXYZ> m_seg;
            //可选参数,设置模型参数需要优化
            m_seg.setOptimizeCoefficients(true);
            //设置分割模型类型、所用的随机参数估计方法、距离阈值、输入点云
            m_seg.setModelType(pcl::SACMODEL_PLANE);
            m_seg.setMethodType(pcl::SAC_RANSAC);
            m_seg.setDistanceThreshold(0.1);
            m_seg.setInputCloud(pt_chip_transformed);
            m_seg.segment(*inliers, *coefficients);
            if (inliers->indices.size() == 0)
            {
                PCL_ERROR("Could not estimate a planar model for the given dataset.");
            }
            //输出平面模型系数
            //std::cerr << "Model coefficients:" << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << " " << coefficients->values[3] << std::endl;

            //pcl::PointCloud<pcl::PointXYZ>::Ptr pt_chip_dsample(new pcl::PointCloud<pcl::PointXYZ>);
            cloud_plane->width = inliers->indices.size();
            cloud_plane->height = 1;
            cloud_plane->is_dense = false;
            cloud_plane->resize(cloud_plane->height * cloud_plane->width);
            for (int i = 0; i < inliers->indices.size(); i++)
            {
                cloud_plane->points[i].x = pt_chip_transformed->points[inliers->indices[i]].x;
                cloud_plane->points[i].y = pt_chip_transformed->points[inliers->indices[i]].y;
                cloud_plane->points[i].z = pt_chip_transformed->points[inliers->indices[i]].z;
            }
        }

执行

m_seg.segment(*inliers, *coefficients);

时出错,错误如下:
System.Runtime.InteropServices.SEHException
HResult=0x80004005
Message=外部组件发生异常。
Source=<无法计算异常源>
StackTrace:
<无法计算异常堆栈跟踪>

已经被困扰好几天,不知道是什么原因,请各位帮忙看一下。非常感谢。

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-14 16:49
    关注
    获得1.50元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的C#与C++混合编程项目中,您使用了PCL(Point Cloud Library)进行点云处理,但在执行m_seg.segment(*inliers, *coefficients);时遇到System.Runtime.InteropServices.SEHException异常。SEHException通常表示发生了外部硬件错误(如内存访问违例)或某些未被捕获的C++异常。针对您的情况,我们可从以下几个方面进行排查和解决:

    1. 检查PCL库兼容性: 确保您使用的PCL版本与当前.NET环境(CLR)兼容,并且正确编译为支持托管代码调用的库(如:动态链接库DLL)。确保在C++/CLI项目中正确引用了PCL库,并且在C#项目中也通过适当的引用或DllImport方式加载了此库。

    2. 内存管理: 检查涉及到的点云数据(如pt_chip_transformed)是否有效,确保其在生命周期内没有被释放或修改。同时,确认分配给cloud_plane的空间是否足够存放分割后的点云数据。

    3. 异常捕获与日志: 将上述C++代码段封装在一个try-catch块中,并在catch部分打印详细的异常信息(如类型、消息和堆栈跟踪)。这有助于定位具体是哪个内部操作引发了SEHException。示例如下:

      try
      {
          // ...(您的现有C++代码)
          m_seg.segment(*inliers, *coefficients);
          // ...
      }
      catch (const std::exception& e)
      {
          std::cerr << "Caught C++ exception: " << e.what() << std::endl;
      }
      catch (...)
      {
          std::cerr << "Caught unknown exception!" << std::endl;
      }
      

      这样可以获取更具体的错误信息,有助于进一步诊断问题。

    4. PCL配置与依赖: 确认PCL库及其依赖(如Eigen、OpenCV等)已正确安装并配置在您的开发环境中。有时,这些依赖库的版本不匹配或缺失可能导致运行时异常。

    5. 数据有效性检查: 在调用segment()函数前,添加对输入点云pt_chip_transformed的检查,确保其包含足够多的有效点(非NaN或Inf),并且点的数量和分布适合进行平面分割。异常可能是由于输入数据不满足PCL算法的预设条件导致的。

    6. 代码重构: 考虑将PCL相关的点云处理逻辑封装到一个独立的C++/CLI类或方法中,以便更好地管理和控制跨语言边界的数据传递与异常处理。这样可以减少托管与非托管代码交互的复杂性,有助于定位问题。

    请按照上述建议逐一排查,并根据实际情况调整代码或环境配置。如果问题依然存在,请提供更详细的错误日志或异常信息,以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。