aatalyk
aatalyk

Reputation: 391

Call OpenCV CvSVMParams in Objective-C

I want to implement SVM algorithm using OpenCV in iOS but can not call some methods in Objective-C. How to call OpenCV CvSVMParams in Objective-C. When I tried this it shows error 'Unknown type name CvSVMParams'

Edited: I understand my mistake I was using old version of OpenCV now I fixed that. But compiler says

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

Upvotes: 0

Views: 443

Answers (1)

aatalyk
aatalyk

Reputation: 391

Problem was solved. I forgot to call train method for Trained Data and change labels from float to integers.

- (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);
}

Upvotes: 0

Related Questions