gpt4 book ai didi

c++ - 如何对OpenCV库的某些类进行抽象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:13 28 4
gpt4 key购买 nike

我有一个基于 OpenCV 词袋训练和测试 NormalBayesClassifier 的类(class)。现在我想将它与基于相同 BOW 的 SVM 多类分类器进行比较。我的想法是不重写同一个类,只将分类器改为SVM而不是NormalBayes。 OpenCV 分类器没有可以帮助我实现此目的的接口(interface),所以我想自己创建一个。但是如何做到这一点呢?

我想到了这样的事情:

// my interface
class IClassifierPtr
{
public:
virtual void train(const cv::Mat& trainDataIn, const cv::Mat& labelsIn) = 0;
virtual double predict(const cv::Mat& testDataIn, cv::Mat* groundTruthIn) = 0;
};

//////////////////////////////

// my normal bayes classifier
class MyNormalBayesClassifier : public IClassifierPtr
{
private:
cv::Ptr< cv::NormalBayesClassifier > m_classifier;

public:
void train(const cv::Mat& trainDataIn, const cv::Mat& labelsIn);
double predict(const cv::Mat& testDataIn, cv::Mat* groundTruthIn);
};

//////////////////////////////

// my svm classifier
class MySVMClassifier : public IClassifierPtr
{
private:
cv::Ptr< cv::SVM > m_classifier;

public:
void train(const cv::Mat& trainDataIn, const cv::Mat& labelsIn);
double predict(const cv::Mat& testDataIn, cv::Mat* groundTruthIn);
};

每一个都有其具体的实现。只需使用界面更改我的训练/测试类中的分类器,并根据输入标志使用所需的分类器。您怎么看,这是要走的路吗?

最佳答案

在 opencv3 中会容易得多,它们都继承自适当的 StatModel 版本(包括 train()/predict())。

但是,如果您发现您的方法中有完全相同的代码,也许您可​​以使用模板:

(警告:我没试过,当前机器上没有 2.4,train()/predict() impl 可能会让人讨厌)

template < typename Classifier >
class MyClassifier : public IClassifierPtr
{
private:
cv::Ptr< Classifier > m_classifier;

public:
MyClassifier(Ptr<Classifier> cl)
: m_classifier(cl)
{}

void train(const cv::Mat& trainDataIn, const cv::Mat& labelsIn);
double predict(const cv::Mat& testDataIn, cv::Mat* groundTruthIn);
};


...
// later:

MyClassifier<cv::NormalBayesClassifier> bayes( new cv::NormalBayesClassifier(... specific params...) );
MyClassifier<cv::SVM> svm( new cv::SVM(... specific params...) );

关于c++ - 如何对OpenCV库的某些类进行抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441213/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com