2017-07-27 30 views
1

我目前正在实施一个通用分类程序,其中用户从opencv输入一个带标签的数据集和一个机器学习技术,程序训练这个分类器。 由于对于一些分类器(在我的示例中是神经网络),输入数据结构需要不同(不是类标号的整数,而是每个类的索引-1/1组成的数组),我应用整数转换器类标签转换为数组类标签。由于我只需要为分类器ANN_MLP而不是其他可能的分类器执行此操作,因此我正在寻找一种方法来检查我的输入分类器是哪种StatModel(opencv中所有分类器的超类)。在opencv中确定StatModel的类型C++

所以我要寻找的是这样的:

void validate(cv::ml::StatModel* classifier){ 
    if(classifier.ofType(cv::ml::ANN_MLP)) 
     do something 
    else 
     do something else 
} 

有谁知道是否有在OpenCV的一个功能检查的子/超类型?

我试图检查

if(typeid(cv::ml::ANN_MLP).hash_code() == typeid(classifier).hash_code()) 

if(typeid(cv::ml::ANN_MLP)==typeid(classifier)) 
C++ equivalent of instanceof

,但这始终返回false,可能是因为如果在这个函数中使用的分类器转换为StatModel?但是,如果子类的底层结构不能保存在某个地方?对不起,如果这是一个愚蠢的问题,但我是新的这种“铸造”/实例问题... 任何帮助是非常apprechiated!谢谢:)

安德烈

+0

规范的C++方法是执行'dynamic_cast'并检查空结果。 –

+0

啊,完美,这很容易;)...因为在我提到的帖子中,'dynamic_cast'被认为是无效的,并且我尝试过type_id条件。你知道为什么这在我的情况下返回false? – Seastar

+0

[你没有把值类型和指针类型混合在一起吗?](http://coliru.stacked-crooked.com/a/be2aef2e22dd079b)。你有'StatModel *'和'cv :: ml:ANN_MLP'来比较 –

回答

0

你忘了传递的参数为指针类型:StatModel*。因此,你需要或者比较它的指针类型的cv::ml::ANN_MLP或从传入的类型剥离它。

或者,dynamic_cast,虽然慢,也将用于ANN_MLP亚型工作。