2016-04-27 36 views
0

我想使用SVM將圖像分類爲紅色和綠色。對於培訓,我從訓練圖像中提取rgba。我也將列表轉換爲numpy數組。但是我得到Error while我給它的SVM training.My示例代碼在opencv中向SVM提供輸入時獲取錯誤

import cv2 
import numpy 
import numpy as np 
from PIL import Image 
import os 
print "OpenCV version : {0}".format(cv2.__version__) 
svm_params = dict(kernel_type = cv2.SVM_LINEAR, 
       svm_type = cv2.SVM_C_SVC, 
       C=2.67, gamma=5.383) 

path1='c:\\colors\\red\\' 
path2='c:\\colors\\green\\' 
training_set = [] 
test_set=[] 
training_labels=[] 
rlist = os.listdir(path1) 
glist= os.listdir(path2) 
for file in rlist: 
    img = Image.open(path1 + file) 
    img200=img.resize((100,100)).convert('RGBA') 
    arr= np.array(img200) 
    print arr 
    training_set.append(arr) 
    training_labels.append(1) 
for file in glist: 
    img = Image.open(path2 + file) 
    img200=img.resize((100,100)).convert('RGBA') 
    arr= np.array(img200) 
    training_set.append(arr) 
    training_labels.append(2) 
######  SVM training  ######################## 
trainData=np.float32(training_set) 
responses=np.float32(training_labels) 
svm = cv2.SVM() 
svm.train(trainData,responses, params=svm_params) 
svm.save('trycolor_svm_data.dat') 

我得到錯誤的

cv2.error: ..\..\..\..\opencv\modules\ml\src\inner_functions.cpp:857: error: (-5) train data must be floating-point matrix in function cvCheckTrainData 

我怎樣才能正確地給予輸入到SVM

回答

1

如果您打印「常用3」你將理解它是一個列表清單。這就是問題所在。在給svm提供輸入之前,你需要將它弄平。

flat_arr= arr.ravel() 

這裏是更正後的代碼。

for file in listing1: 
img = Image.open(path1 + file) 
img200=img.resize((100,100)).convert('RGBA') 
arr= np.array(img200) 
flat_arr= arr.ravel() 
training_set.append(flat_arr) 
training_labels.append(1) 
for file in listing2: 
img = Image.open(path2 + file) 
img200=img.resize((100,100)).convert('RGBA') 
arr= np.array(img200) 
flat_arr= arr.ravel() 
training_set.append(flat_arr) 
training_labels.append(2) 
+0

Thanks.It工作 – Frido

+0

@Frido如果它的工作接受答案 – Emmanu