opencv cv :: Ptr的动态强制转换

时间:2017-08-02 09:06:16

标签: c++ opencv pointers casting dynamic-cast

我目前正在同一个类中用c ++实现不同的opencv机器学习工具。因此,我遇到了将超类cv::ml::StatModel的指针向下转换为子类cv::ml::SVM的问题(例如)。

在在线教程中,人们通常会发现opencv分类器的实现,如下所示:

cv::Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();

我想要做的是在类构造函数中进行动态转换。这是我的类变量的一部分:

class Classifier{
private:
    cv::Ptr<cv::ml::StatModel> classifier;
    cv::Ptr<cv::ml::SVM> SVM;
//... followed by more code };

在我的构造函数中:

Classifier::Classifier(const char* filename, cv::ml::SVM& svm){
    bool load = Classifier::getData(filename);
    if (load==0){
        cout << "Error opening file!" << endl;
    }
    else{
        classifier = &svm;
        //Here I want to do something linke this, just with cv::Ptr:
        //the following line gives compiler errors because c++ does not know that cv::Ptr is a pointer...
        SVM = dynamic_cast<cv::ml::SVM*>(classifier); 
        Classifier::setUpSVM();
    }
}

是否有人知道opencv是否为dynamic_cast<T>()的{​​{1}}提供了替代?或者有使用opencv指针的经验,而是“正常”的c ++指针使用机器学习API?我想知道我是否会遇到这个实现的问题,因为通常的做法似乎是使用opencv cv::Ptr类。

1 个答案:

答案 0 :(得分:7)

是的,有dynamic_cast<T>()专门针对cv::Ptr编写的openCV替代版本。它被称为...... dynamicCast():D此外,还有类似的const cast和static cast的替代方案。