但你为什么要分类这个“手工”? OpenCV的has a classification routine称为predict
,使用中发现的SV和阿尔法
float response = SVM.predict(sampleMat);
如果你真的想自己做它,你将不仅需要颗卫星和阿尔法也用于培训和COMPUT内核函数
SUM alpha_i K(support_vector_i , data_point) - rho
我不知道是否有可能提取阿尔法“手动”但不扩展SVM类,如可以在sources看到 - 阿尔法存储在CvSVMDecisionFunc
结构:
struct CvSVMDecisionFunc
{
double rho;
int sv_count;
double* alpha;
int* sv_index;
};
,而这种结构的唯一引用是protected
部分:
protected:
(...)
CvSVMDecisionFunc* decision_func;
从svm.cpp
的源代码,我们可以发现,这是只有通过save
例行公开入店。因此,一些“黑客”将保存模型并从那里提取alpha(它将位于“Decision function”部分,用人类可读的格式编写)。
最简单的extracion技术似乎程度CvSVM
类,并包括像澄清后
public:
CvSVMDecisionFunc* get_decision_function() { return decision_func; }
更新
方法,即OP实际上是试图在OpenCV中使用externaly训练模型 - 最简单的方法是通过其他方法(libsvm,linearsvm等)将libsvm模型转换为opencv兼容格式并使用read
方法将其转换为方法
void CvSVM::read(CvFileStorage* fs, CvFileNode* svm_node)
see source for more details。
据我所知,你可以使用.predict(),但是你必须提供一个已经计算好的HOG用于一个完全相同大小的图像,就像你训练过的CvSVM一样,这是不方便的。如果你想使用扫描给定图像的例程,并返回一个点数组,它找到了答案,你应该使用.detectMultiScale()。 – degot
我不太了解你的评论。支持向量机将总是**需要与训练中使用的输入大小相同的输入。无论您提取alpha还是使用预测方法都无关紧要,它将以相同的方式工作。 – lejlot
好吧,首先,我决定不使用openCV进行培训,因为我发现了很多信息,人们说使用svmlight或libsvm更好,所以我不能使用CvSVMDecisionFunc。我所说的第二件事是detectMultiScale()获取任意大小的图像,并为您完成所有工作,在图像的每个点计算HOG,并返回匹配点。我对吗? – degot