http://blog.csdn.net/WL2002200/article/details/43149229

OpenCV 中KNN构造函数如下。

  1. C++: CvKNearest::CvKNearest()
  2. C++: CvKNearest::CvKNearest(const Mat& trainData, const Mat& responses, const Mat& sam-
  3. pleIdx=Mat(), bool isRegression=false, int max_k=32 )

训练函数为:

  1. C++: bool CvKNearest::train(
  2. const Mat& trainData, //训练数据
  3. const Mat& responses,//对应的响应值
  4. const Mat& sampleIdx=Mat(),//样本索引
  5. bool isRegression=false,//是否是回归,否则是分类问题
  6. int maxK=32, //最大K值
  7. bool updateBase=false//是否更新数据,是,则maxK需要小于原数据大小 )

查找函数:

  1. C++: float CvKNearest::find_nearest(
  2. const Mat& samples,//按行存储的测试数据
  3. int k, //K 值
  4. Mat* results=0,//预测结果
  5. const float** neighbors=0, //近邻指针向量
  6. Mat* neighborResponses=0, //近邻值
  7. Mat* dist=0 //距离矩阵) const
  8. C++: float CvKNearest::find_nearest(
  9. const Mat& samples,
  10. int k,
  11. Mat& results,
  12. Mat& neighborResponses,
  13. Mat& dists) const

还有一些其他辅助函数,无关紧要,略去了。

opencv 有KNN 的示例,改写成C++ 版本如下:

    1. #include <opencv2/core/core.hpp>
    2. #include <opencv2/highgui/highgui.hpp>
    3. #include <opencv2/ml/ml.hpp>
    4. int main( )
    5. {
    6. const int K = 10;
    7. int i, j, k, accuracy;
    8. float response;
    9. int train_sample_count = 100;
    10. cv::RNG rng_state(-1);
    11. cv::Mat trainData(train_sample_count,2,CV_32FC1);
    12. cv::Mat trainClasses(train_sample_count,1,CV_32FC1);
    13. cv::Mat img(cv::Size(500,500),CV_8UC3,cv::Scalar::all (0));
    14. float _sample[2];
    15. cv::Mat sample(1,2,CV_32FC1,_sample);
    16. cv::Mat trainData1, trainData2, trainClasses1, trainClasses2;
    17. // form the training samples
    18. trainData1 = trainData.rowRange (0,train_sample_count/2);
    19. rng_state.fill (trainData1,CV_RAND_NORMAL,cv::Scalar(200,200),cv::Scalar(50,50));
    20. trainData2 = trainData.rowRange (train_sample_count/2,train_sample_count);
    21. rng_state.fill (trainData2,CV_RAND_NORMAL,cv::Scalar(300,300),cv::Scalar(50,50));
    22. trainClasses1 = trainClasses.rowRange (0,train_sample_count/2);
    23. trainClasses1.setTo (1);
    24. trainClasses2 = trainClasses.rowRange (train_sample_count/2,train_sample_count);
    25. trainClasses2.setTo (2);
    26. // learn classifier
    27. CvKNearest knn( trainData, trainClasses, cv::Mat(), false, K );
    28. cv::Mat nearests( 1, K, CV_32FC1);
    29. for( i = 0; i < img.rows; i++ )
    30. {
    31. for( j = 0; j < img.cols; j++ )
    32. {
    33. sample.at<float>(0,0) = (float)j;
    34. sample.at<float>(0,1) = (float)i;
    35. // estimate the response and get the neighbors' labels
    36. response = knn.find_nearest(sample,K,0,0,&nearests,0);
    37. // compute the number of neighbors representing the majority
    38. for( k = 0, accuracy = 0; k < K; k++ )
    39. {
    40. if( nearests.at<float>(0,k) == response)
    41. accuracy++;
    42. }
    43. // highlight the pixel depending on the accuracy (or confidence)
    44. img.at<cv::Vec3b>(i,j) = response == 1 ?
    45. (accuracy > 5 ? cv::Vec3b(0,0,180) : cv::Vec3b(0,120,180)) :
    46. (accuracy > 5 ? cv::Vec3b(0,180,0) : cv::Vec3b(0,120,120));
    47. }
    48. }
    49. // display the original training samples
    50. for( i = 0; i < train_sample_count/2; i++ )
    51. {
    52. cv::Point pt;
    53. pt.x = cvRound(trainData1.at<float>(i,0));
    54. pt.y = cvRound(trainData1.at<float>(i,1));
    55. cv::circle (img,pt,2,cv::Scalar(0,0,255),1,CV_FILLED);
    56. pt.x = cvRound(trainData2.at<float>(i,0));
    57. pt.y = cvRound(trainData2.at<float>(i,1));
    58. cv::circle (img,pt,2,cv::Scalar(0,255,0),1,CV_FILLED);
    59. }
    60. cv::namedWindow( "classifier result", 1 );
    61. cv::imshow( "classifier result", img );
    62. cv::waitKey(0);
    63. return 0;
    64. }

OpenCV KNN 之 使用方法的更多相关文章

  1. opencv中的.at方法

    opencv中的.at方法是用来获取图像像素值得函数: interpolation:差值 histogram:直方图

  2. 学习OpenCV——KNN算法

    转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...

  3. 使用opencv显示视频的方法

    下面对使用opencv显示视频做一个简单的记录.当然,网上这方面的资料已经数不胜数了,我只是将其简单记录,总结一下. 在opencv中显示视频主要有: (1)从本地读取视频和调用摄像头读取视频 (2) ...

  4. OpenCV的矩阵合并方法

    有的时候我们需要将几个矩阵按行或者按列进行合并成一个大矩阵,这在Matlab里面非常的简单,但在OpenCV里面并没有这样的方法,现在我在OpenCV的源码里面发现合并矩阵的方法,分享给大家. A = ...

  5. OpenCV——KNN分类算法 <摘>

    KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一. 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本 ...

  6. 相机标定 matlab opencv ROS三种方法标定步骤(3)

    三 ,  ROS 环境下 如何进行相机标定 刚开始做到的时候遇到一些问题没有记录下来,现在回头写的时候都是没有错误的结果了,首先使用ROS标定相机, 要知道如何查看节点之间的流程图  rosrun r ...

  7. 相机标定 matlab opencv ROS三种方法标定步骤(1)

    一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...

  8. 海康威视采集卡结合opencv使用(两种方法)-转

    (注:第一种方法是我的原创 ^_^. 第二种方法是从网上学习的.) 第一种方法:利用 板卡的API:  GetJpegImage 得到 Jpeg 格式的图像数据,然后用opencv里的一个函数进行解码 ...

  9. OpenCV:OpenCV目标检测Boost方法训练

    在古老的CNN方法出现以后,并不能适用于图像中目标检测.20世纪60年代,Hubel和Wiesel( 百度百科 )在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈 ...

随机推荐

  1. c++ const(不断跟新)

    1.把一个 const 对象的地址赋给一个普通的.非 const 对象的指针也会导致编译时的错误: const double pi = 3.14; double *ptr = π // error: ...

  2. Javascript通过bind()掌控this

    Javascript通过bind()掌控this: http://blog.csdn.net/rznice/article/details/26134201 bind能为我们做些什么,同时它的好处在哪 ...

  3. Fragment,仿QQ空间

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451          在今天的这篇文章当中,我依然会以实战加理论结合 ...

  4. Java使用Commons-FileUpload组件实现文件上传最佳方案

    学习的目标 使用commons-fileupload实现文件上传 使用commons-fileupload封装文件上传工具类   什么是commons-fileupload? The CommonsF ...

  5. Java/android 里ClassName.this和this的使用

    如果在内部类里面用this就是指这个内部类的实例,而如果用OuterClassName.this就是它外面的那个类的实例 ClassName.this这个用法多用于在nested class(内部类) ...

  6. Jenkins 持续集成配置

    Jenkins搭建.NET自动编译测试与发布环境 Jenkins之Deploy部署(包括站点和类库项目) * 续篇--TFS+MSbuild+jenkins 实现 持续集成+自动部署到WEB网站 Je ...

  7. End-to-End Speech Recognition in English and Mandarin

    w语音识别.噪音.方言,算法迭代. https://arxiv.org/abs/1512.02595 We show that an end-to-end deep learning approach ...

  8. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS 笔记

    队列服务就是为了提高相应速度,把耗时或者不需要即时处理的流程放到异步处理过程中,HTTPSQS就是这样一个服务. 更详细的可以参考 http://blog.s135.com/httpsqs/,这里记录 ...

  9. golang几种post方式

    用golang进行http请求类型多了,总结备忘一下. 1.普通的post\get请求 var r http.Request r.ParseForm() r.Form.Add("uuid&q ...

  10. vs2010 重新配置帮助文档

    1.VS2010帮助文件不支持重新配置,这个时候打开C:\Program Files\Microsoft Help Viewer\1.0目录,找到“HelpLibManager.exe.config” ...