博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv+svm
阅读量:5960 次
发布时间:2019-06-19

本文共 2641 字,大约阅读时间需要 8 分钟。

hot3.png

为了学习OPENCV SVM分类器, 参考网上的"利用SVM解决2维空间向量的分类问题"实现并改为C++代码,仅供参考

 

环境:OPENCV2.2 + VS2008

步骤:

1,生成随机的点,并按一定的空间分布将其归类
2,创建SVM并利用随机点样本进行训练
3,将整个空间按SVM分类结果进行划分,并显示支持向量

 

[cpp] 

  1. #include "stdafx.h"  

  2. #include <opencv2/opencv.hpp>  

  3.   

  4. void drawCross(Mat &img, Point center, Scalar color)  

  5. {  

  6.     int col = center.x > 2 ? center.x : 2;  

  7.     int row = center.y> 2 ? center.y : 2;  

  8.   

  9.     line(img, Point(col -2, row - 2), Point(col + 2, row + 2), color);    

  10.     line(img, Point(col + 2, row - 2), Point(col - 2, row + 2), color);    

  11. }  

  12.   

  13. int newSvmTest(int rows, int cols, int testCount)  

  14. {  

  15.     if(testCount > rows * cols)  

  16.         return 0;  

  17.   

  18.     Mat img = Mat::zeros(rows, cols, CV_8UC3);  

  19.     Mat testPoint = Mat::zeros(rows, cols, CV_8UC1);  

  20.     Mat data = Mat::zeros(testCount, 2, CV_32FC1);  

  21.     Mat res = Mat::zeros(testCount, 1, CV_32SC1);  

  22.   

  23.     //Create random test points  

  24.     for (int i= 0; i< testCount; i++)   

  25.     {   

  26.         int row = rand() % rows;  

  27.         int col = rand() % cols;  

  28.   

  29.         if(testPoint.at<unsigned char>(row, col) == 0)  

  30.         {  

  31.             testPoint.at<unsigned char>(row, col) = 1;  

  32.             data.at<float>(i, 0) = float (col) / cols;   

  33.             data.at<float>(i, 1) = float (row) / rows;   

  34.         }  

  35.         else  

  36.         {  

  37.             i--;  

  38.             continue;  

  39.         }  

  40.   

  41.         if (row > ( 50 * cos(col * CV_PI/ 100) + 200) )  

  42.         {   

  43.             drawCross(img, Point(col, row), CV_RGB(255, 0, 0));  

  44.             res.at<unsigned int>(i, 0) = 1;   

  45.         }   

  46.         else   

  47.         {   

  48.             if (col > 200)   

  49.             {   

  50.                 drawCross(img, Point(col, row), CV_RGB(0, 255, 0));  

  51.                 res.at<unsigned int>(i, 0) = 2;   

  52.             }   

  53.             else   

  54.             {   

  55.                 drawCross(img, Point(col, row), CV_RGB(0, 0, 255));  

  56.                 res.at<unsigned int>(i, 0) = 3;   

  57.             }   

  58.         }   

  59.   

  60.     }  

  61.   

  62.     //Show test points  

  63.     imshow("dst", img);  

  64.     waitKey(0);  

  65.   

  66.     /START SVM TRAINNING//  

  67.     CvSVM svm = CvSVM();   

  68.     CvSVMParams param;   

  69.     CvTermCriteria criteria;  

  70.   

  71.     criteria= cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);   

  72.     param= CvSVMParams (CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, criteria);   

  73.   

  74.     svm.train(data, res, Mat(), Mat(), param);  

  75.   

  76.     for (int i= 0; i< rows; i++)   

  77.     {   

  78.         for (int j= 0; j< cols; j++)   

  79.         {   

  80.             Mat m = Mat::zeros(1, 2, CV_32FC1);  

  81.             m.at<float>(0,0) = float (j) / cols;  

  82.             m.at<float>(0,1) = float (i) / rows;  

  83.   

  84.             float ret = 0.0;   

  85.             ret = svm.predict(m);   

  86.             Scalar rcolor;   

  87.   

  88.             switch ((int) ret)   

  89.             {   

  90.                 case 1: rcolor= CV_RGB(100, 0, 0); break;   

  91.                 case 2: rcolor= CV_RGB(0, 100, 0); break;   

  92.                 case 3: rcolor= CV_RGB(0, 0, 100); break;   

  93.             }   

  94.   

  95.             line(img, Point(j,i), Point(j,i), rcolor);  

  96.         }   

  97.     }  

  98.   

  99.     imshow("dst", img);  

  100.     waitKey(0);  

  101.   

  102.     //Show support vectors  

  103.     int sv_num= svm.get_support_vector_count();   

  104.     for (int i= 0; i< sv_num; i++)   

  105.     {   

  106.         const float* support = svm.get_support_vector(i);   

  107.         circle(img, Point((int) (support[0] * cols), (int) (support[1] * rows)), 5, CV_RGB(200, 200, 200));   

  108.     }  

  109.   

  110.     imshow("dst", img);  

  111.     waitKey(0);  

  112.   

  113.     return 0;  

  114. }  

  115.   

  116. int main(int argc, char** argv)  

  117. {  

  118.     return newSvmTest(400, 600, 100);  

  119. }  

 

学习样本:

 

分类:

 

支持向量:

转载于:https://my.oschina.net/gujianhan/blog/188567

你可能感兴趣的文章
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
2013 Linux领域年终盘点
查看>>
linux学习之查看程序端口占用情况
查看>>
相逢在栀枝花开的季节
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>
mysql多实例实例化数据库
查看>>
我的友情链接
查看>>
golang xml和json的解析与生成
查看>>
javascript 操作DOM元素样式
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
【查找算法】基于存储的查找算法(哈希查找)
查看>>
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
做程序开发的你如果经常用Redis,这些问题肯定会遇到
查看>>
006android初级篇之jni数据类型映射
查看>>
org.openqa.selenium.StaleElementReferenceException
查看>>
HBase 笔记3
查看>>
Linux嵌入式GDB调试环境搭建
查看>>