OpenCV KNN 之 使用方法
http://blog.csdn.net/WL2002200/article/details/43149229
OpenCV 中KNN构造函数如下。
- C++: CvKNearest::CvKNearest()
- C++: CvKNearest::CvKNearest(const Mat& trainData, const Mat& responses, const Mat& sam-
- pleIdx=Mat(), bool isRegression=false, int max_k=32 )
训练函数为:
- C++: bool CvKNearest::train(
- const Mat& trainData, //训练数据
- const Mat& responses,//对应的响应值
- const Mat& sampleIdx=Mat(),//样本索引
- bool isRegression=false,//是否是回归,否则是分类问题
- int maxK=32, //最大K值
- bool updateBase=false//是否更新数据,是,则maxK需要小于原数据大小 )
查找函数:
- C++: float CvKNearest::find_nearest(
- const Mat& samples,//按行存储的测试数据
- int k, //K 值
- Mat* results=0,//预测结果
- const float** neighbors=0, //近邻指针向量
- Mat* neighborResponses=0, //近邻值
- Mat* dist=0 //距离矩阵) const
- C++: float CvKNearest::find_nearest(
- const Mat& samples,
- int k,
- Mat& results,
- Mat& neighborResponses,
- Mat& dists) const
还有一些其他辅助函数,无关紧要,略去了。
opencv 有KNN 的示例,改写成C++ 版本如下:
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/ml/ml.hpp>
- int main( )
- {
- const int K = 10;
- int i, j, k, accuracy;
- float response;
- int train_sample_count = 100;
- cv::RNG rng_state(-1);
- cv::Mat trainData(train_sample_count,2,CV_32FC1);
- cv::Mat trainClasses(train_sample_count,1,CV_32FC1);
- cv::Mat img(cv::Size(500,500),CV_8UC3,cv::Scalar::all (0));
- float _sample[2];
- cv::Mat sample(1,2,CV_32FC1,_sample);
- cv::Mat trainData1, trainData2, trainClasses1, trainClasses2;
- // form the training samples
- trainData1 = trainData.rowRange (0,train_sample_count/2);
- rng_state.fill (trainData1,CV_RAND_NORMAL,cv::Scalar(200,200),cv::Scalar(50,50));
- trainData2 = trainData.rowRange (train_sample_count/2,train_sample_count);
- rng_state.fill (trainData2,CV_RAND_NORMAL,cv::Scalar(300,300),cv::Scalar(50,50));
- trainClasses1 = trainClasses.rowRange (0,train_sample_count/2);
- trainClasses1.setTo (1);
- trainClasses2 = trainClasses.rowRange (train_sample_count/2,train_sample_count);
- trainClasses2.setTo (2);
- // learn classifier
- CvKNearest knn( trainData, trainClasses, cv::Mat(), false, K );
- cv::Mat nearests( 1, K, CV_32FC1);
- for( i = 0; i < img.rows; i++ )
- {
- for( j = 0; j < img.cols; j++ )
- {
- sample.at<float>(0,0) = (float)j;
- sample.at<float>(0,1) = (float)i;
- // estimate the response and get the neighbors' labels
- response = knn.find_nearest(sample,K,0,0,&nearests,0);
- // compute the number of neighbors representing the majority
- for( k = 0, accuracy = 0; k < K; k++ )
- {
- if( nearests.at<float>(0,k) == response)
- accuracy++;
- }
- // highlight the pixel depending on the accuracy (or confidence)
- img.at<cv::Vec3b>(i,j) = response == 1 ?
- (accuracy > 5 ? cv::Vec3b(0,0,180) : cv::Vec3b(0,120,180)) :
- (accuracy > 5 ? cv::Vec3b(0,180,0) : cv::Vec3b(0,120,120));
- }
- }
- // display the original training samples
- for( i = 0; i < train_sample_count/2; i++ )
- {
- cv::Point pt;
- pt.x = cvRound(trainData1.at<float>(i,0));
- pt.y = cvRound(trainData1.at<float>(i,1));
- cv::circle (img,pt,2,cv::Scalar(0,0,255),1,CV_FILLED);
- pt.x = cvRound(trainData2.at<float>(i,0));
- pt.y = cvRound(trainData2.at<float>(i,1));
- cv::circle (img,pt,2,cv::Scalar(0,255,0),1,CV_FILLED);
- }
- cv::namedWindow( "classifier result", 1 );
- cv::imshow( "classifier result", img );
- cv::waitKey(0);
- return 0;
- }
OpenCV KNN 之 使用方法的更多相关文章
- opencv中的.at方法
opencv中的.at方法是用来获取图像像素值得函数: interpolation:差值 histogram:直方图
- 学习OpenCV——KNN算法
转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...
- 使用opencv显示视频的方法
下面对使用opencv显示视频做一个简单的记录.当然,网上这方面的资料已经数不胜数了,我只是将其简单记录,总结一下. 在opencv中显示视频主要有: (1)从本地读取视频和调用摄像头读取视频 (2) ...
- OpenCV的矩阵合并方法
有的时候我们需要将几个矩阵按行或者按列进行合并成一个大矩阵,这在Matlab里面非常的简单,但在OpenCV里面并没有这样的方法,现在我在OpenCV的源码里面发现合并矩阵的方法,分享给大家. A = ...
- OpenCV——KNN分类算法 <摘>
KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一. 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本 ...
- 相机标定 matlab opencv ROS三种方法标定步骤(3)
三 , ROS 环境下 如何进行相机标定 刚开始做到的时候遇到一些问题没有记录下来,现在回头写的时候都是没有错误的结果了,首先使用ROS标定相机, 要知道如何查看节点之间的流程图 rosrun r ...
- 相机标定 matlab opencv ROS三种方法标定步骤(1)
一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...
- 海康威视采集卡结合opencv使用(两种方法)-转
(注:第一种方法是我的原创 ^_^. 第二种方法是从网上学习的.) 第一种方法:利用 板卡的API: GetJpegImage 得到 Jpeg 格式的图像数据,然后用opencv里的一个函数进行解码 ...
- OpenCV:OpenCV目标检测Boost方法训练
在古老的CNN方法出现以后,并不能适用于图像中目标检测.20世纪60年代,Hubel和Wiesel( 百度百科 )在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈 ...
随机推荐
- 用httpClient的PostMethot频繁发送数据,抛出Too many open files
在工作过程中,用httpclient去压测一个web api,发现压一小段时间就出现了Too many open files.实际上,HttpClient建立Socket时 ,post.release ...
- Netty 服务端创建
参考:http://blog.csdn.net/suifeng3051/article/details/28861883?utm_source=tuicool&utm_medium=refer ...
- 160411、实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- 20165330 2017-2018-2《Java程序设计》课程总结
20165330 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:做中学learning by doing个人感想及学习基础 ...
- Put queue for MemoryTransaction of capacity 10000 full, consider committing more frequently, increasing capacity or increasing thread count flume capacity 时间数
package com.test; import org.apache.http.*;import org.apache.http.entity.ContentType;import org.apac ...
- python基础-第二篇-基本数据类型
一.运算符 1.算数运算: 算数运算符相信大家都不陌生吧,尤其是加减乘除,好!那我就带着大家看看最后三个,这三个到底是干什么玩意的? %,取两数相除的余数,看图: **,x的多少次幂,看图: //,取 ...
- docker网络实践
docker网络.md #docker 网络模式 环境 centos7.4 , Docker version 17.12.0-ce docker自带网络类型 bridge,host,none,cont ...
- 服务遇到错误。很可能由IncludeExceptionDetailInFaults=true创建的ExceptionDetail,其值为:System.ArgumentException:指定的值还有无效的控制字符
解决方案:将服务的应用程序池由 集成 修改为 经典.(或者 可以反过来试下.) 环境:WindowsServer2008R2+IIS7.5+WCF 出错样图:
- git查看某一个文件的修改历史
git blame filename:显示整个文件的每一行的详细修改信息:包括SHA串,日期和作者. 其显示格式为: commit ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | ...
- wordpress 自己制作子主题 child theme
使用 WordPress 的子主题(Child Themes)功能快速制作自己的主题 在了解子主题功能之前,先来看一下你在使用 WordPress 的时候是否是这样:不会自己制作主题,只好从网上下载一 ...