2017-08-02 12 views
1

私は現在、同じクラスのC++でさまざまなopencvマシン学習ツールを実装しています。したがって、スーパークラスcv::ml::StatModelのポインタをサブクラスcv::ml::SVM(たとえば)にダウンキャストするという問題があります。 1は通常、このようなOpenCVの分類器の実装を見つけ、オンラインチュートリアルでopencvの動的キャストcv :: Ptr

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 }; 

そして、私のコンストラクタで:OpenCVのはcv::Ptrためdynamic_cast<T>()への代替を提供する場合

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ポインタを使用していない経験がありますが、機械学習APIを使用するための "通常の" C++ポインタがありますか?一般的なプラクティスはopencv cv::Ptrクラスを使用しているようですので、この実装で問題が発生するかどうかは疑問です。

+0

私の質問へのアップデートとして:実行時に 'dynamic_cast'行に' Segmentation Fault'エラーが出ます(opencv Ptrの代わりに通常のポインタを使います)。誰でもopencv Ptrを使って動的なキャストを手伝うことができますか? – Seastar

答えて

4

はい、具体的にはcv::Ptrと書かれたdynamic_cast<T>()という代替のopenCVがあります。それは... dynamicCast()と呼ばれます:Dその点では、constキャストと静的キャストの類似の代替もあります。

+0

Aaaah、オハイオ州の男、ときどき徹底的に調べてみましょう:P私はドキュメンテーションを見ましたが、唯一の理由はstaticCastです:/ありがとうございました! – Seastar

+0

問題ありません、私は助けることができてうれしい;)注意してください! – KjMag

関連する問題