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. 模拟http请求 带 chunked解析办法一

    今天在干坏事抓取别人页面时候遇到一个问题,平时我们在post数据后,大不了要求提交cookie,但是今天这个测试了N遍不需要coookie都行的,但是抓取到的始终是乱码,怎么解析都不行.于是自己又把c ...

  2. 非IE图片上传预览

    $("#uploadFiles").change(function (e) {                if (e.target.files) {               ...

  3. android基础---->AccessibilityService的简单使用(一)

    AccessibilityService类可以帮助我们实现监听手机上别的应用,以下做一个简单的总结.我总是勇敢的离开一个人 却不懂如何巧妙的靠近一个人. AccessibilityService的使用 ...

  4. 160321、ORACLE分页查询SQL语法——最高效的分页

    --1:无ORDER BY排序的写法.(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT *   FROM (SELE ...

  5. APNS/苹果推送服务

    Apple Push Notification Service Google Cloud Message/Google 云 消息 Firebase Cloud Messaging

  6. iOS如何让主界面不显示NavigationBar

    这个问题曾经困扰过我.现在我给出正解.- (void)viewWillAppear:(BOOL)animated {    [super viewWillAppear:animated]; [self ...

  7. Unpacking and repacking stock rom .img files

    http://forum.xda-developers.com/galaxy-s2/general/ref-unpacking-repacking-stock-rom-img-t1081239 OP ...

  8. CLR via 笔记 5.3 值类型的装箱和拆箱

    1.装箱 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(Boxing)的机制. 1.在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类 ...

  9. jquery的常用知识点

    一.用jquery寻找元素 1.选择器 基本选择器: $("*") $("#id") 用id匹配 $(".class") 用class名匹配 ...

  10. 软中断和tasklet介绍

    今天看了下tasklet,重点分析了其和软中断的关系,特此记录 关于软中断,在之前的中断文章中已经有所介绍,这里就不多说了,只是说明下,系统中默认支持32种软中断,而实际上系统定义的软中断仅有以下几种 ...