Ich implementiere derzeit verschiedene opencv Machine Learning Tools in C++ in der gleichen Klasse. Daher habe ich das Problem, Zeiger der Oberklasse cv::ml::StatModel
in die Unterklasse cv::ml::SVM
(zum Beispiel) zu verwerfen.Dynamic Cast für opencv cv :: Ptr
In Online-Tutorials findet man in der Regel die Umsetzung der opencv Klassifizierer wie folgt aus:
cv::Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
Was ich will ist eine dynamische Umwandlung im Konstruktor der Klasse zu tun. Dies ist Teil meiner Klassenvariablen:
class Classifier{
private:
cv::Ptr<cv::ml::StatModel> classifier;
cv::Ptr<cv::ml::SVM> SVM;
//... followed by more code };
Und in meinem Konstruktor:
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();
}
}
Weiß jemand, ob opencv eine Alternative zu dynamic_cast<T>()
für cv::Ptr
bietet? Oder hat alternativ Erfahrung mit der Verwendung der opencv-Zeiger, sondern "normalen" C++ - Zeiger, um die Machine Learning API zu verwenden? Ich frage mich, ob ich Probleme mit dieser Implementierung bekommen werde, denn die gängige Praxis scheint die opencv cv::Ptr
Klasse zu verwenden.
Als Update zu meiner Frage: Zur Laufzeit bekomme ich einen 'Segmentation Fault' Fehler in der' dynamic_cast' Zeile (mit normalen Zeigern anstelle von opencv Ptr). Kann mir jemand helfen, die dynamische Besetzung mit dem opencv Ptr zu machen? – Seastar