opencv 基于SVM的几何形状识别

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

效果如图所示

opencv 基于SVM的几何形状识别_第1张图片


你可能感兴趣的:(opencv 基于SVM的几何形状识别)