【问题标题】:Expectation Maximization openCV期望最大化openCV
【发布时间】:2021-05-03 20:19:59
【问题描述】:

我正在尝试基于example code执行:

  using namespace cv;
  using namespace cv::ml;
  // mat is a Mat containing the features computed beforehand
  Ptr<EM> model = EM::create();
  model->setClustersNumber(static_cast<int>(m_numberClusters));
  Mat logs, labels, probs;
  model->trainEM(mat, logs, labels, probs);

setClustersNumber 给出分段错误,如果注释掉,则 trainEM 会出现。调试显示,这些都是纯虚函数,与OpenCV API一致。

看这里:

尽管如此,我没有找到任何具有这些纯虚函数的实现类,也没有发现 OpenCV 3.x.x 版本的期望最大化的其他示例。

【问题讨论】:

  • 你试过调试吗?您应该在取消引用之前检查model ptr 是否有效。 mat 定义的变量在哪里被传递到 trainEM 方法中?
  • @M.A 是的,我进行了调试,vPtr 显示命名函数是纯虚拟的。如文档行中所述,垫子是预先计算的。它是有效的,也是 EM Ptr。只是功能没有实现。我从这里获取代码:programming.vip/docs/…
  • 我不明白你的意思,I do not find any implementation of this pure virtual class,如果你做了调试,你知道模型 ptr 的底层类型,这个类有 setClusterNumber 函数的覆盖定义或其中之一它的基类。调用函数时出现段错误,在这种情况下 ptr 无效,或者在函数内部,在这种情况下,模型 ptr 构造不正确或传递给 setClustersNumber 的参数无效。
  • @M.A 纯虚函数我的意思是,我正在调用的那些。我添加了屏幕截图并更正了句子。
  • 好的,但它们实际上不能是抽象的,因为您的编译器不允许您实例化抽象类型(具有抽象函数的类型)。

标签: c++ opencv


【解决方案1】:

其他答案12 解释了此运行时错误。

EM::Create 静态方法返回一个指向抽象类型的指针,我认为这是一个糟糕的 API 设计选择。 您可能打算定义一个覆盖这些抽象方法的派生类型。由于静态方法无法访问当前对象,我看不出它有什么用途。

您的编译器可能无法知道对象的动态类型,而动态类型恰好是抽象的。由于指针的原因,单层间接可能会使编译器难以检测到此问题。这是一个人为的例子 (godbolt)。

struct a
{
    a(int) {};
    virtual int test() = 0;

    static a* Create() {return (a*)(new int{});};
};

int main()
{
    auto aptr = a::Create();
    aptr->test();
}

【讨论】:

  • @JanHackenberg 覆盖您自己的派生类中的方法,或创建一个指向 OpenCV 中从 EM 类型派生的具体类型的 ptr。抱歉,如果不清楚
  • 我试图在 OpenCV 中找到一种能够转换该指针的具体类型,但没有找到。如果我在这里理解正确的话,我现在尝试在一个虚拟类中覆盖这两个函数来强制正确更新 vPtr 表。但它没有用。编写一个提供正确实现所需功能的非虚拟类是不可能的。
  • 你能详细说明一下吗,它不起作用。如果您从 EM 派生自定义类并覆盖抽象方法,然后创建该类型的实例,您甚至不需要依赖虚拟查找,只需使用指向派生类型的指针。而且,如果您尝试在不覆盖所有抽象方法的情况下进行实例化,您的编译器会警告您。另请注意,您不能使用 EM::Create 方法创建派生类型。
  • 如果我必须使用我的派生类而不是来自 EM::Create 的派生类,我必须实现完整的机器学习方法。这就是我的意思是不可能的。我想我可以修复虚拟查找,只需实现一个带有空虚拟函数调用的派生类而不使用它。情况似乎并非如此。 EM::Create 后面肯定有一个具体的类,因为我可以在使用 VS 而不是 GCC 的 win 机器上执行我编译的代码。但我在 OpenCV 中找不到那个具体的类。
猜你喜欢
  • 2013-05-23
  • 2013-12-09
  • 2014-01-17
  • 2012-12-23
  • 1970-01-01
  • 2021-05-31
  • 2013-10-13
  • 2013-03-08
  • 2014-10-28
相关资源
最近更新 更多