2016-08-24 7 views
0

OpenCVを使ってiOSでSVMアルゴリズムを実装したいのですが、Objective-Cでいくつかのメソッドを呼び出せません。 Objective-CでOpenCV CvSVMParamsを呼び出す方法私はこれを試してみたところ、「Unknown type name CvSVMParams」と表示されます。Objective-CでOpenCV CvSVMParamを呼び出してください。

編集:私の間違いを理解しています。私は古いバージョンのOpenCVを使用していました。しかし、コンパイラは

OpenCV Error: Assertion failed (samples.cols == var_count && samples.type() == CV_32F) in predict, file /Volumes/Linux/builds/precommit_ios/opencv/modules/ml/src/svm.cpp, line 1919 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Volumes/Linux/builds/precommit_ios/opencv/modules/ml/src/svm.cpp:1919: error: (-215) samples.cols == var_count && samples.type() == CV_32F in function predict

#import "CustomObject.h" 
#import <opencv2/opencv.hpp> 
#import <CoreGraphics/CoreGraphics.h> 
#import <UIKit/UIKit.h> 

using namespace cv; 

@implementation CustomObject 

- (void) supportVectorMachine { 

float labels[10] = { 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0 }; 
cv::Mat labelsMat(10, 1, CV_32FC1, labels); 

float trainingData[10][2] = { { 100, 10 }, { 150, 10 }, { 600, 200 }, { 600, 10 }, { 10, 100 }, { 455, 10 }, { 345, 255 }, { 10, 501 }, { 401, 255 }, { 30, 150 } }; 

cv::Mat trainDataMat(10, 2, CV_32FC1, trainingData); 

//opencv 3.0 
Ptr<ml::SVM> svm = ml::SVM::create(); 
// edit: the params struct got removed, 
// we use setter/getter now: 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::LINEAR); 
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 

Ptr<TrainData> td = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat); 

//Create test features 
float testData[2] = { 150, 15 }; 

cv::Mat testDataMat(2, 1, CV_32FC1, testData); 

//Predict the class labele for test data sample 
float predictLable = svm->predict(testDataMat); 

NSLog(@"%f", predictLable); 

} 

end 

答えて

0

問題が解決したと言います。訓練されたデータの列車メソッドを呼び出すことを忘れて、ラベルを浮動小数点から整数に変更するのを忘れました。

- (void) supportVectorMachine { 

int labels[10] = {1, 1, 1}; 
cv::Mat labelsMat(10, 1, CV_32S, labels); 

float trainingData[3][3] = { { 84, 191, 19 }, { 24, 186, 17}, { 22, 157, 21} }; 

//float trainingData[10][1] = { 100, 150, 600, 600, 100, 455, 345, 501, 401, 150}; 

cv::Mat trainDataMat(3, 3, CV_32FC1, trainingData); 



//opencv 3.0 
Ptr<ml::SVM> svm = ml::SVM::create(); 
// edit: the params struct got removed, 
// we use setter/getter now: 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::LINEAR); 
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 
svm->setGamma(3.0); 

Ptr<TrainData> td = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat); 
svm->train(td); 

//Create test features 
float testData[1] = {500}; 

cv::Mat testDataMat(1, 1, CV_32FC1, testData); 

//Predict the class labele for test data sample 
float predictLable = svm->predict(testDataMat); 

NSLog(@"%f", predictLable); 
} 
関連する問題