机器学习之-利用svm(支持向量机)分类(opencv3)

svm分类算法在opencv3中有了很大的变动,取消了CvSVMParams这个类,因此在参数设定上会有些改变。

opencv中的svm分类代码,来源于libsvm。

int main(int argc, char** argv)
{
	// visual representation
	int width = 512;
	int height = 512;
	cv::Mat image = cv::Mat::zeros(height, width, CV_8UC3);

	// training data
	int labels[4] = { 1, -1, -1, -1 };
	float trainingData[4][2] = { { 501, 10 },{ 255, 10 },{ 501, 255 },{ 10, 501 } };
	cv::Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
	cv::Mat labelsMat(4, 1, CV_32SC1, labels);

	// initial SVM
	cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
	svm->setType(cv::ml::SVM::Types::C_SVC);
	svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);
	svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));

	// train operation
	svm->train(trainingDataMat, cv::ml::SampleTypes::ROW_SAMPLE, labelsMat);

	// prediction
	cv::Vec3b green(0, 255, 0);
	cv::Vec3b blue(255, 0, 0);
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			cv::Mat sampleMat = (cv::Mat_<float>(1, 2) << j, i);
			float respose = svm->predict(sampleMat);
			if (respose == 1)
				image.at<cv::Vec3b>(i, j) = green;
			else if (respose == -1)
				image.at<cv::Vec3b>(i, j) = blue;
		}
	}

	int thickness = -1;
	int lineType = cv::LineTypes::LINE_8;

	cv::circle(image, cv::Point(501, 10), 5, cv::Scalar(0, 0, 0), thickness, lineType);
	cv::circle(image, cv::Point(255, 10), 5, cv::Scalar(255, 255, 255), thickness, lineType);
	cv::circle(image, cv::Point(501, 255), 5, cv::Scalar(255, 255, 255), thickness, lineType);
	cv::circle(image, cv::Point(10, 501), 5, cv::Scalar(255, 255, 255), thickness, lineType);

	thickness = 2;
	lineType = cv::LineTypes::LINE_8;

	cv::Mat sv = svm->getSupportVectors();
	for (int i = 0; i < sv.rows; i++)
	{
		const float* v = sv.ptr<float>(i);
		cv::circle(image, cv::Point((int)v[0], (int)v[1]), 6, cv::Scalar(128, 128, 128), thickness, lineType);
	}


	cv::imshow("SVM Simple Example", image);


	cv::waitKey(0);
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值