使用OpenCV-3.0.1/python 2.7创建svm

使用OpenCV-3.0.1/python 2.7创建svm,python,opencv,Python,Opencv,这是一个多么奇怪的系统啊。我的问题与这里的问题相同: 但是我不能在这个问题上再添加任何问题或评论,所以我不得不问几乎相同的问题。 无论如何,请在以下方面提供帮助: 所以我注意到CV-3.0.1既有卡方核又有交叉核,而我以前的2.4.9没有,所以我升级了(gentoo btw)。一切都在2.4.9中运行,我只是希望有更多的内核选择(而intersection与我所做的工作配合得很好,Yang et al 2009说) 但是遵循上面的方法对我来说并不奏效 除了我平时的工作: import cv2

这是一个多么奇怪的系统啊。我的问题与这里的问题相同: 但是我不能在这个问题上再添加任何问题或评论,所以我不得不问几乎相同的问题。 无论如何,请在以下方面提供帮助:

所以我注意到CV-3.0.1既有卡方核又有交叉核,而我以前的2.4.9没有,所以我升级了(gentoo btw)。一切都在2.4.9中运行,我只是希望有更多的内核选择(而intersection与我所做的工作配合得很好,Yang et al 2009说)

但是遵循上面的方法对我来说并不奏效

除了我平时的工作:

import cv2
我尝试添加:

import cv2.ml
和/或

from cv2 import ml
它们不会修复任何东西(我对python也有点陌生,所以不确定我要使用的是哪一种)

我的路线:

svm = cv2.SVM()
是什么导致了问题,我已尝试将其更改为:

svm = cv2.ml.SVM()
但这并不能解决问题,我得到的只是:

Traceback (most recent call last):
File "05traintestsift.py", line 12, in svm = cv2.SVM()
AttributeError: 'module' object has no attribute 'SVM'
或:

当然有一些基本的方法可以让我错过的东西重新工作

注意:除了尝试新的内核类型外,其他一切都在半小时前的2.4.9版本中正常工作,因此3.0.1-r2版本中的一些新语法发生了变化

我还将注意到,他们在文档中的示例:也没有放入任何“.ml”,因此即使是它也没有更新(我从他们示例的第48行复制了svm=cv2.svm()语法)

我注意到,如果我只是删除这一行,它将进一步遍历代码,使用上一个问题中的.ml修复,它可以很好地接受我的参数:

svm_params = dict(kernel_type = cv2.ml.SVM_CHI2,svm_type = cv2.ml.SVM_C_SVC,C=7,gamma=3)
但是当我去训练时,它找不到svm:

svm.train(traindata,trainnames,params=svm_params)

(显然,因为我还没有创建“svm”对象)

它应该是什么样子:

trainingDataMat = np.array(*train_data*, np.float32)
labelsMat = np.array([*label_data*], np.int32)

svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
# svm.setDegree(0.0)
# svm.setGamma(0.0)
# svm.setCoef0(0.0)
# svm.setC(0)
# svm.setNu(0.0)
# svm.setP(0.0)
# svm.setClassWeights(None)
svm.setTermCriteria((cv2.TERM_CRITERIA_COUNT, 100, 1.e-06))
svm.train(trainingDataMat, cv2.ml.ROW_SAMPLE, labelsMat)

sample_data = np.array([*your_data*], np.float32)
response = svm.predict(sample_data)

您提到的示例适用于较旧版本的OpenCV

您可以在opencv/sources/samples/python中找到解释良好的新示例

在新的OpenCV中,应使用SVM,如下所示:

#SVM in OpenCV 3.1.0 for Python
SVM = cv2.ml.SVM_create()
SVM.setKernel(cv2.ml.SVM_LINEAR)
SVM.setP(0.2)
SVM.setType(cv2.ml.SVM_EPS_SVR)
SVM.setC(1.0)

#training
SVM.train_auto(samples, cv2.ml.ROW_SAMPLE, responses)

#predict
output = SVM.predict(samples)[1].ravel()
#SVM in OpenCV 3.1.0 for Python
SVM = cv2.ml.SVM_create()
SVM.setKernel(cv2.ml.SVM_LINEAR)
SVM.setP(0.2)
SVM.setType(cv2.ml.SVM_EPS_SVR)
SVM.setC(1.0)

#training
SVM.train_auto(samples, cv2.ml.ROW_SAMPLE, responses)

#predict
output = SVM.predict(samples)[1].ravel()