opencv 基于SVM的几何形状识别

来源:互联网 发布:windows live影片制作 编辑:程序博客网 时间:2024/04/29 17:09

        很多时候,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可直接运行。下载链接

效果如图所示



0 0