【发布时间】: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 版本的期望最大化的其他示例。
【问题讨论】:
-
你试过调试吗?您应该在取消引用之前检查
modelptr 是否有效。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 纯虚函数我的意思是,我正在调用的那些。我添加了屏幕截图并更正了句子。
-
好的,但它们实际上不能是抽象的,因为您的编译器不允许您实例化抽象类型(具有抽象函数的类型)。