SVM与OpenCV

小编 2026-06-29 阅读:228 评论:0
SVM是一个成熟经典的技术,被用在很多分类问题中,比如早期的人脸识别问题,很多是HOG+SVM。最近在做识别魔方颜色的时候,研究了OpenCV中的SVM分类器。 首先还是来看官方文档 https://d...

SVM是一个成熟经典的技术,被用在很多分类问题中,比如早期的人脸识别问题,很多是HOG+SVM。最近在做识别魔方颜色的时候,研究了OpenCV中的SVM分类器。

首先还是来看官方文档

https://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms

https://docs.opencv.org/3.4/d1/d73/tutorial_introduction_to_svm.html

两个教程例子都比较直观,给定一些二维点的坐标(x,y)和标签label(人为指定,-1和1),进行SVM的训练,然后调用训练模型进行预测,并将结果做了直观显示。

opencv2跟3中的训练样本有细微差别,主要是样本数据为CV_32SC1和CV_32FC1的差别

https://blog.csdn.net/wfh2015/article/details/51163890

    //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->setDegree(0.0);
	//svm->setGamma(1.0);
	//svm->setCoef0(0.0);
	//svm->setC(1.0);
	//svm->setNu(0.0);
	//svm->setP(0.0);
	//svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS , 20000, 0.001));
	// svm->train(trainingData, cv::ml::SampleTypes::ROW_SAMPLE, classes);
	 
	//cv::Ptr<cv::ml::TrainData> &&trainDataSet = cv::ml::TrainData::create(trainingData, cv::ml::ROW_SAMPLE, classes);
	//svm->trainAuto(trainDataSet);
	//svm.train(trainingData, classes, Mat(), Mat(), SVM_params);

	CvSVMParams SVM_params;
	SVM_params.svm_type = CvSVM::C_SVC;
	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 + cv::TermCriteria::EPS, 20000, 0.001);

	CvSVM svm;
	svm.train_auto(trainingData, classes, Mat(), Mat(), SVM_params);
	
	//保存模型
	svm.save(\"D:\\\\opencv_work\\\\cubeSolver\\\\svm.xml\");
	//svm->save(\"D:\\\\opencv_work\\\\cubeSolver\\\\svm.xml\");

学习的时候,我跟着这个教程做了一遍 。因为手写数字集的图片opencv本身就带有,而且作者还手把手带着做了一遍,包括图片分割,样本数据集的建立,最后利用训练的模型识别手写数字0和1。注意的地方是,数字图片的文件夹事先建立好,不然以为它没有把图片分割成功。另外,训练集合测试集自己拷贝好,训练集每个数字400张图片,测试集每个数字100张图片。

 \"\"

1的测试数据集 100张识别正确99张,有一个没识别对,可以从上图中看到,1写的还是很怪的。0的识别完成正确。

\"\"

总结下, 官方例子的特征向量为二维点x和y,label为-1和1。width*height=2*4, label的维度width*height=1*4。

0,1手写数字识别的特征向量为大小20x20,3通道的图片,每个像素点都是特征参数。每张图片有20*20*3=1200个特征,0和1的图片共有800张,因此训练用的特征向量的维度为width*height=1200*800,label的维度width*height=1*800,0和1的label各一半,各四百个。从这两个例子看到,label的第二维和data的第二维相等,通俗理解就是有多少个样本就有多少条label。cv::ml::SampleTypes::ROW_SAMPLE样本为行排列,一行为一个样本。

魔方颜色SVM 

有了上面的例子的经验,就可以看看魔方的颜色识别的例子了,一般的三阶魔方有6个颜色,每个颜色,考虑到光照的影响,这里将RGB三通道和HSV三通道一共六个数据作为特征。一个行样本就是这6个数据,标签lable就是颜色值,这里将颜色值与数字123456相对应,便于程序计算。

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
标签列表