Использование сеттеров и геттеров в AlgorithmInfo :: addParam для наследования алгоритмов

Я работаю над созданием собственного алгоритма наследования от cv :: Algorithm, используя ссылка из документов OpenCV. Я создал свои собственные классы, которые успешно наследуют от cv :: Algorithm, но у меня возникают трудности с этим, так как он имеет член m_model который является частью библиотеки, которая не может быть изменена, потому что MyAlgorithm класс оборачивает функциональность в эту структуру.

В любом случае, я пытаюсь ссылаться на член внутри структуры, который является `uchar [3], поэтому я обернул его в cv :: Ptr.
Когда я компилирую свою программу без и методов получения и установки методов addParam

obj.info()->addParam<uchar[3]>(obj, "arrPtr",  *arrPtr, false);

код компилируется нормально, но я получаю ошибку во время выполнения, когда я пытаюсь write объект MyAlgorithm в файл, потому что он не может получить данные. Он ищет переменную-член с arr имя, но оно не существует Итак, я определил некоторые методы получения и установки для arr параметр в пределах m_model член класса.

Однако я не уверен, как передать указатели на функции-члены в метод addParams. Я знаю, что не могу просто передать их в метод addParams, как функцию, которую я сейчас выполняю в приведенном ниже коде. Я также попробовал следующее:

obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, &MyAlgorithm::getArr, &MyAlgorithm::setArr);

но я получаю ошибку компиляции:

cannot convert parameter 5 from 'cv::Ptr<_Tp> (__thiscall MyAlgorithm::* )(void)' to 'cv::Ptr<_Tp> (__thiscall cv::Algorithm::* )(void)'

Ниже приведен урезанный пример моего исходного кода. Любая помощь будет принята с благодарностью.

my_algorithm.h

class MyAlgorithm : public cv::Algorithm    {
public:
//Other class logic
cv::Ptr<uchar[3]> getArr();
void setArr(const cv::Ptr<uchar[3]> &arrPtr);

virtual cv::AlgorithmInfo* info() const;
protected:
//define members such as m_model
};
cv::Algorithm* createMyAlgorithm();
cv::AlgorithmInfo& MyAlgorithm_info();

my_algorithm.cpp

cv::Algorithm* createMyAlgorithm()
{
return new MyAlgorithm();
}

cv::AlgorithmInfo& MyAlgorithm_info()
{
static cv::AlgorithmInfo MyAlgorithm_info_var("MyAlgorithm", createMyAlgorithm);
return MyAlgorithm_info_var;
}

cv::AlgorithmInfo* MyAlgorithm::info() const
{
static volatile bool initialized = false;

if( !initialized )
{
initialized = true;
MyAlgorithm obj;
cv::Ptr<uchar[3]> *arrPtr = new cv::Ptr<uchar[3]>(&(obj.m_model->arr));
obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, &getArr, &setArr);
}
return &MyAlgorithm_info();
}

cv::Ptr<uchar[3]> MyAlgorithm::getArr(){
//Logic to get arr
}
void MyAlgorithm::setArr(const cv::Ptr<uchar[3]> &arrPtr){
//Logic to set arr
}

2

Решение

Мне удалось получить setter а также getter для addParam метод для работы. Проблема заключалась в том, что мне нужно было выполнить static_cast в родительский класс, например, так:

typedef cv::Ptr<uchar[3]> (cv::Algorithm::*ArrGetter)();
typedef void (cv::Algorithm::*ArrSetter)(const cv::Ptr<uchar[3]> &);
obj.info()->addParam<uchar[3]>(obj, "arr",  *arrPtr, false, static_cast<ArrGetter>(&MyAlgorithm::getArr), static_cast<ArrSetter>(&MyAlgorithm::setArr));

Тем не менее, я также обнаружил, что OpenCV не знает, как обрабатывать чтение и запись uchar[3], Я попробовал cv::Vec3b который, кажется, не работает, так что я остановился на cv::Mat используя сеттеры и геттеры. Таким образом, окончательное решение выглядит примерно так.

my_algorithm.h

class MyAlgorithm : public cv::Algorithm    {
public:
typedef cv::Mat (cv::Algorithm::*ArrGetter)();
typedef void (cv::Algorithm::*ArrSetter)(const cv::Mat &);

//Other class logic
cv::Mat getArr();
void setArr(const cv::Mat &arrPtr);

virtual cv::AlgorithmInfo* info() const;
protected:
uchar[3] arr;
};
cv::Algorithm* createMyAlgorithm();
cv::AlgorithmInfo& MyAlgorithm_info();

my_algorithm.cpp

cv::AlgorithmInfo* MyAlgorithm::info() const
{
static volatile bool initialized = false;

if( !initialized )
{
initialized = true;
MyAlgorithm obj;
cv::Vec3b arrVec(arr);
obj.info()->addParam(obj, "arr",  (cv::Mat)arrVec, false, static_cast<ArrGetter>(&MyAlgorithm::getArr), static_cast<ArrSetter>(&MyAlgorithm::setArr));
}
return &MyAlgorithm_info();
}

cv::Mat MyAlgorithm::getArr(){
cv::Vec3b arrVec(arr);
return (cv::Mat)arrVec;
}
void MyAlgorithm::setArr(const cv::Mat &arrMat){
for (int i = 0; i < 3; i++)
arr[i] = arrMat.at<uchar>(i);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]