В настоящее время я реализую программу общей классификации, где пользователь вводит маркированный набор данных и технику машинного обучения из opencv, и программа обучает этот классификатор.
Поскольку для некоторых классификаторов (в моем примере нейронных сетей) структура входных данных должна отличаться (не целое число как метка класса, а массив, составленный из индекса -1/1 для каждого класса), я применяю преобразователь целочисленного класса метка для метки класса массива. Поскольку мне нужно сделать это только для классификатора ANN_MLP, а не для других возможных классификаторов, я ищу способ проверить, какой тип StatModel (суперкласса всех классификаторов в opencv) мой классификатор ввода.
Поэтому я ищу что-то вроде этого:
void validate(cv::ml::StatModel* classifier){
if(classifier.ofType(cv::ml::ANN_MLP))
do something
else
do something else
}
Кто-нибудь знает, есть ли в opencv функциональность для проверки типа подклассов / суперклассов?
Я пытался проверить
if(typeid(cv::ml::ANN_MLP).hash_code() == typeid(classifier).hash_code())
а также
if(typeid(cv::ml::ANN_MLP)==typeid(classifier))
от C ++ эквивалент instanceof, но это всегда возвращает false, возможно, потому что классификатор приведен к StatModel, если используется в этой функции? Но разве основная структура подкласса не должна быть где-то сохранена? Извините, если это глупый вопрос, но я новичок в такого рода проблемах «кастинга» / экземпляра …
Любая помощь очень ценится! Спасибо:)
Andrea
Вы забыли, что переданный параметр имеет тип указателя: StatModel*
, Таким образом, вам нужно либо сравнить его с типом указателя cv::ml::ANN_MLP
или лишить его из переданного типа.
С другой стороны, dynamic_cast
хотя и медленнее, также будет работать для подтипов ANN_MLP
,
Других решений пока нет …