2017-08-02 99 views
1

我目前在C++中實現不同的opencv機器學習工具在同一個類。因此,我有將超類cv::ml::StatModel的指針向下轉換爲子類cv::ml::SVM(例如)的問題。動態演員爲opencv cv :: Ptr

在網上教程人們通常認爲的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提供了cv::Ptrdynamic_cast<T>()替代?或者有沒有使用opencv指針的經驗,而是使用機器學習API的「正常」C++指針?我想知道我是否會遇到這個實現的問題,因爲通常的做法似乎是使用opencv cv::Ptr類。

+0

作爲我的問題的更新:在運行時,我''dynamic_cast'行(使用普通指針而不是opencv Ptr)出現'Segmentation Fault'錯誤。任何人都可以幫我做opencv Ptr的動態演員嗎? – Seastar

回答

4

是的,有一個dynamic_cast<T>()專門爲cv::Ptr編寫的openCV替代方案。它被稱爲... dynamicCast():D對於這個問題,也有類似的替代方法來處理常規投射和靜態投射。

+0

Aaaah,哦,有時候看起來非常有幫助:P我在文檔中看過,但是隻找到staticCast:/非常感謝! – Seastar

+0

沒問題,很高興我能幫忙;)保重! – KjMag