私は現在、同じクラスの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
クラスを使用しているようですので、この実装で問題が発生するかどうかは疑問です。
私の質問へのアップデートとして:実行時に 'dynamic_cast'行に' Segmentation Fault'エラーが出ます(opencv Ptrの代わりに通常のポインタを使います)。誰でもopencv Ptrを使って動的なキャストを手伝うことができますか? – Seastar