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. Java中关于枚举的7种用法

    1.定义常量: public enum Color { RED,ORANGE,YELLOW,GREEN,INDIGO,BLUE,PURPLE } 2.用于switch: enum Color { RE ...

  2. warning: Now you can provide attr "wx:key" for a "wx:for" to improve performance.

    小程序开发过程中在写for循环的时候会出现如下报错 warning: Now you can provide attr "wx:key" for a "wx:for&qu ...

  3. 160401、关于cronExpression的介绍

    关于cronExpression的介绍:   每一个字段都有一套可以指定有效值,如 Seconds (秒):可以用数字0-59 表示, Minutes(分)          :可以用数字0-59 表 ...

  4. 160311、mybatis sql语句中转义字符

    问题: 在mapper  ***.xml中的sql语句中,不能直接用大于号.小于号要用转义字符 解决方法:   1.转义字符串 小于号    <    < 大于号    >    & ...

  5. 解决CMD编译中文乱码

    chcp 是MD DOS中的命令,用了显示或设置活动的代码编号的,用法查看当前编码格式(系统默认为:936  #936表示的是gb2312) chcp 修改当前编码格式(修改为utf-8) chcp ...

  6. mysql备份总结

    w汇总对比. mysqldump -u user -p wdbname > /www/wbak.sql pwd CREATE TABLE wbak_w_02071349 LIKE w; INSE ...

  7. Yii框架2.0 数据库操作初接触

    Yii2.0和Yii1.1版本的变动还是挺多的,我发现配置文件有许多不同,Yii1.1版本里有个main.php 好多信息是在这里配置的,比如默认控制器,数据库连接信息:Yii的数据库配置被单独拿出来 ...

  8. python 面向对象(进阶篇)转载武沛齐

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  9. Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级

    在平时的开发工作中,经常遇到这样一个场景,在数据库中存储了具有父子关系的数据,需要将这些数据以树形结构的形式在界面上进行展示.本文的目的是提供了一个通用的编程模型,解决将具有父子关系的数据转换成树形结 ...

  10. Swift学习——Swift基础具体解释(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...