【问题标题】:Using Setters and Getters in AlgorithmInfo::addParam for Algorithm inheritance在 AlgorithmInfo::addParam 中使用 Setter 和 Getter 进行算法继承
【发布时间】:2012-09-07 17:57:22
【问题描述】:

我正在使用the reference from the OpenCV docs 创建自己的算法,继承自 cv::Algorithm。我创建了自己的类,这些类成功地从 cv::Algorithm 继承,但我在使用这个时遇到了困难,因为它有一个成员 m_model,它是来自一个无法修改的库的结构,因为 MyAlgorithm 类将功能包装在此结构中。

无论如何,我试图引用结构中的一个成员,它是一个 `uchar[3],所以我将它包装在一个 cv::Ptr 中。 当我在 addParam 方法上编译没有和 getter 或 setter 的程序时

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

代码编译得很好,但是当我尝试将 write 一个 MyAlgorithm 对象归档时出现运行时错误,因为它无法获取数据。它正在寻找一个名称为arr 的成员变量,但它不存在。所以我在m_model类成员中为arr参数定义了一些getter和setter方法。

但是,我不确定如何将成员函数指针传递给 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();

我的算法.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
}

【问题讨论】:

    标签: c++ algorithm image-processing opencv member-function-pointers


    【解决方案1】:

    我设法让settergetter 使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,它似乎也不起作用,所以我使用setter 和getter 选择了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();
    

    我的算法.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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2011-03-21
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多