您的位置:首页 > 运维架构

opencv 基于SVM的几何形状识别

2016-09-08 15:37 471 查看
        很多时候,findcontours之后,得到一个封闭的几何形状,如果知道是圆,那就想办法参数化表达圆,如果知道是矩形,相应的想办法参数化表达矩形。当我们开发好简单的直线或者圆的参数化表达算法后,会发现,如何知道是圆还是直线,成为一个迫切需要解决的问题。

      本文博文利用SVM实现几何形状的识别。目前只支持cirlce rectangle triangle cross四种。了解其中的原理和思路后,想要支持更多几何形状的识别,我相信,并不是难事。

      话不多说,先要部分代码。

 1、得到训练的数据    

void getData()
{
trainData.create(train_samples*classes, sampleSize.width*sampleSize.height, CV_32FC1);
trainClasses.create(train_samples*classes, 1, CV_32FC1);
Mat src_image;
char file[255];
int i, j;
for (i = 0; i<classes; i++)
{
for (j = 0; j< train_samples; j++)
{
sprintf(file, "samples/s%d/%d.png", i, j);
src_image = imread(file, 0);
if (src_image.empty())
{
printf("Error: Cant load image %s\n", file);
//exit(-1);
}
Mat image = readImageSaveContour(src_image);
Mat imageNewSize;
resize(image, imageNewSize, sampleSize, CV_INTER_LINEAR);
image.release();
image = imageNewSize.reshape(1, 1);
image.convertTo(trainData(Range(i*train_samples + j, i*train_samples + j + 1), Range(0, trainData.cols)), CV_32FC1);
trainClasses.at<float>(i*train_samples + j, 0) = i;
}
}
}
2、申明一个SVM类,并训练

CvSVMParams SVM_params;  // CvSVMParams结构用于定义基本参数
SVM_params.svm_type = CvSVM::C_SVC;     // SVM类型
SVM_params.kernel_type = CvSVM::LINEAR; // 不做映射
SVM_params.degree = 0;
SVM_params.gamma = 1;
SVM_params.coef0 = 0;
SVM_params.C = 1;
SVM_params.nu = 0;
SVM_params.p = 0;
SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);

CvSVM SVM;
SVM.train(trainData, trainClasses, Mat(), Mat(), SVM_params);


好吧,展示的部分代码就到此为止。

下面给出整个工程以及训练样本的下载。vs2013+opencv2.4.13可直接运行。下载链接

效果如图所示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: