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实现自己的ArrayList

    利用自己对ArrayList的理解,重写了Java的ArrayList工具类,旨在理解源码的精髓: public class MyArrayList<T> { //成员变量 private ...

  2. ORA-00845 MEMORY_TARGET not supported on this system解决办法

    ORA-00845: MEMORY_TARGET not supported on this system报错解决 Oracle 11g数据库修改pfile参数后启动数据库报错ora-00845 SQ ...

  3. 常用MySQL函数

    MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ...

  4. dede标签:arclist标签使用大全

    特别提示:arclist是织梦建站系统中最重要的标签,同时也是最基础的标签,希望大家熟练掌握,可以说是学习织梦必备知识. 标签名称:arclist标记简介:织梦常用标记,也称为自由列表标记,其中img ...

  5. c#使用FastReports打印

    private void btnprint_Click(object sender, EventArgs e) { //报表路径 string path = Application.StartupPa ...

  6. UNION DISTINCT

    w同结构表读写合并. DROP PROCEDURE IF EXISTS w_ww_amzasin; DELIMITER /w/ CREATE PROCEDURE w_ww_amzasin() BEGI ...

  7. puppeteer部署到centOS上出现launch chrome fail的情况

    在Mac上调试无问题,放到阿里云上运行会报错. 需要先安装依赖, yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 lib ...

  8. 病毒侵袭持续中---hdu3065(AC自动机模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 模板题,没什么好说的... #include<stdio.h> #include&l ...

  9. Python并行编程(一):基本概念

    1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个 ...

  10. Linux命令(基础3)

    关机重启 reboot poweroff ============================ linux命令分类 1.针对不同文件的管理命令 1.1 目录 FHS 文件系统层次化标准 绝对路径: ...