OpenCV 实现一个自己的Algorithm类

11 篇文章 0 订阅
3 篇文章 0 订阅

OpenCV 2.4引入的新基类Algorithm类,简单的研究了一下。

由于Algorithm类刚出来不久,网上介绍它的资料非常少,这里实现一个自己的Algorithm类的模板,大家可以作为参考:

注意如果自己实现一个扩展模板,实现一个initModule_<ModuleName>函数并在使用模块的算法之前调用一次是必须的,这样,才能够强迫C++链接器去链接目标模块。

否则,会出现链接错误!

class MyOpencvAlgorithm : public cv::Algorithm {
 public:
  virtual AlgorithmInfo* info() const;

  void Do() {
    printf("=== Do MyOpencv Algorithm! ===");
  }
};

Algorithm* CreateMyOpencvAlgorithm() {
  return new MyOpencvAlgorithm;
}

AlgorithmInfo& MyOpencvAlgorithmInfo() {
  static AlgorithmInfo info("MyOpencvAlgorithm", CreateMyOpencvAlgorithm);
  return info;
}

AlgorithmInfo* MyOpencvAlgorithm::info() const {
  return &(MyOpencvAlgorithmInfo());
}

bool initModule_MyOpencv() {
  Ptr<Algorithm> p = CreateMyOpencvAlgorithm();
  return p->info() != NULL;
}

int main( int argc, char** argv )
{
  initModule_MyOpencv();
  Ptr<MyOpencvAlgorithm> pm = Algorithm::create<MyOpencvAlgorithm>("MyOpencvAlgorithm");
  pm->Do();

  cout << endl;
  vector<string> algorithms;
  Algorithm::getList(algorithms);
  copy(algorithms.begin(), algorithms.end(), ostream_iterator<string>(cout, "\n"));
  cout << algorithms.size();

  return 0;
}

其实,这就是一个创建模式而已。

  1. 首先,实现一个创建函数:
    Algorithm* CreateMyOpencvAlgorithm() {
      return new MyOpencvAlgorithm;
    }
    
  2. 然后,再写一个返回标识AlgorithmInfo的函数,这个Info里就知道了如何创建一个MyOpencvAlgirhtm对象需要调用的函数:
    AlgorithmInfo& MyOpencvAlgorithmInfo() {
      static AlgorithmInfo info("MyOpencvAlgorithm", CreateMyOpencvAlgorithm);
      return info;
    }
  3. 继承自Algorithm基类,并实现它的虚函数info():
    class MyOpencvAlgorithm : public cv::Algorithm {
     public:
      virtual AlgorithmInfo* info() const;
    
      void Do() {
        printf("=== Do MyOpencv Algorithm! ===");
      }
    };
    AlgorithmInfo* MyOpencvAlgorithm::info() const {
      return &(MyOpencvAlgorithmInfo());
    }
  4. 最后,再来一个initModule_<ModuleName>型的函数:
    bool initModule_MyOpencv() {
      Ptr<Algorithm> p = CreateMyOpencvAlgorithm();
      return p->info() != NULL;
    }
  5. 大功告成,已经可以使用了:
    int main( int argc, char** argv )
    {
      initModule_MyOpencv();
      Ptr<MyOpencvAlgorithm> pm = Algorithm::create<MyOpencvAlgorithm>("MyOpencvAlgorithm");
      pm->Do();
    }








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值