OpenCV学习4-----K-Nearest Neighbors(KNN)demo
最近用到KNN方法,学习一下OpenCV给出的demo。
demo大意是随机生成两团二维空间中的点,然后在500*500的二维空间平面上,计算每一个点属于哪一个类,然后用红色和绿色显示出来每一个点
如下是一系demo里用到的相关函数。

运行效果:
红色背景应该是表示每一个像素的类别标签和红色的点的标签相同。同理,绿色背景表示绿色的像素与绿色的点是同一个类的。

demo.cpp:
#include "ml.h"
#include "highgui.h" int main( int argc, char** argv )
{
const int K = ;
int i, j, k, accuracy;
float response;
int train_sample_count = ;
CvRNG rng_state = cvRNG(-);
CvMat* trainData = cvCreateMat( train_sample_count, , CV_32FC1 );
CvMat* trainClasses = cvCreateMat( train_sample_count, , CV_32FC1 );
IplImage* img = cvCreateImage( cvSize( , ), , );
float _sample[];
CvMat sample = cvMat( , , CV_32FC1, _sample );
cvZero( img ); CvMat trainData1, trainData2, trainClasses1, trainClasses2; // form the training samples
cvGetRows( trainData, &trainData1, , train_sample_count/ );
cvRandArr( &rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(,), cvScalar(,) ); cvGetRows( trainData, &trainData2, train_sample_count/, train_sample_count );
cvRandArr( &rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(,), cvScalar(,) ); cvGetRows( trainClasses, &trainClasses1, , train_sample_count/ );
cvSet( &trainClasses1, cvScalar() ); cvGetRows( trainClasses, &trainClasses2, train_sample_count/, train_sample_count );
cvSet( &trainClasses2, cvScalar() ); // learn classifier
CvKNearest knn( trainData, trainClasses, , false, K );
CvMat* nearests = cvCreateMat( , K, CV_32FC1); for( i = ; i < img->height; i++ )
{
for( j = ; j < img->width; j++ )
{
sample.data.fl[] = (float)j;
sample.data.fl[] = (float)i; // estimate the response and get the neighbors' labels
response = knn.find_nearest(&sample,K,,,nearests,); // compute the number of neighbors representing the majority
for( k = , accuracy = ; k < K; k++ )
{
if( nearests->data.fl[k] == response)
accuracy++;
}
// highlight the pixel depending on the accuracy (or confidence)
cvSet2D( img, i, j, response == ?
(accuracy > ? CV_RGB(,,) : CV_RGB(,,)) :
(accuracy > ? CV_RGB(,,) : CV_RGB(,,)) );
}
} // display the original training samples
for( i = ; i < train_sample_count/; i++ )
{
CvPoint pt;
pt.x = cvRound(trainData1.data.fl[i*]);
pt.y = cvRound(trainData1.data.fl[i*+]);
cvCircle( img, pt, , CV_RGB(,,), CV_FILLED );
pt.x = cvRound(trainData2.data.fl[i*]);
pt.y = cvRound(trainData2.data.fl[i*+]);
cvCircle( img, pt, , CV_RGB(,,), CV_FILLED );
} cvNamedWindow( "classifier result", );
cvShowImage( "classifier result", img );
cvWaitKey(); cvReleaseMat( &trainClasses );
cvReleaseMat( &trainData );
return ;
}
参考:
https://docs.opencv.org/2.4/modules/ml/doc/k_nearest_neighbors.html
OpenCV学习4-----K-Nearest Neighbors(KNN)demo的更多相关文章
- [机器学习系列] k-近邻算法(K–nearest neighbors)
C++ with Machine Learning -K–nearest neighbors 我本想写C++与人工智能,但是转念一想,人工智能范围太大了,我根本介绍不完也没能力介绍完,所以还是取了他的 ...
- 转载: scikit-learn学习之K最近邻算法(KNN)
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- <机器学习实战>读书笔记--k邻近算法KNN
k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...
- 学习笔记之k-nearest neighbors algorithm (k-NN)
k-nearest neighbors algorithm - Wikipedia https://en.wikipedia.org/wiki/K-nearest_neighbors_algorith ...
- K NEAREST NEIGHBOR 算法(knn)
K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...
- OpenCV 学习笔记 06 图像检索以及基于图像描述符的搜索
OpenCV 可以检测图像的主要特征,然后提取这些特征,使其成为图像描述符,这些图像特征可作为图像搜索的数据库:此外可以利用关键点将图像拼接 stitch 起来,组成一个更大的图像.如将各照片组成一个 ...
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
- 机器学习--K近邻 (KNN)算法的原理及优缺点
一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
随机推荐
- GPUImage源码解读之GPUImageContext
GPUImageContext类,提供OpenGL ES基本上下文,GPUImage相关处理线程,GLProgram缓存.帧缓存.由于是上下文对象,因此该模块提供的更多是存取.设置相关的方法. 属性列 ...
- About Me - 关于
0x00 简介 97年生 计算机相关专业,无线电安全攻防方向. 涉猎较多,喜欢研究无线.硬件.软件.网络.攻击.检测.防御等各类安全技术 精通较少,主要擅长的还是硬件.渗透.无线攻击方面. 现阶段在研 ...
- C++分享笔记:扑克牌的洗牌发牌游戏设计
笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏.具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌.然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等. ...
- 4 二维数组中的查找 JavaScript
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- IO流,字符流
import java.io.FileReader; public class FileReaderDemo { public static void main(String[] args) thro ...
- Case Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk.Que ...
- 使用maven下载cdh版本的大数据jar包
在pom文件中添加 cloudera 配置文件 <repositories> <repository> <id>cloudera</id> <ur ...
- 一、linux基本操作
1.linux界面的切换 DOS界面终端打开:Ctrl+Alt+F1 /F2/F3 退出:Ctrl+Alt+F7 终端的打开与退出 打开:Ctrl+Alt+t 退出:Ctrl+d 2.第一次 ...
- 树莓派如何连接WIFI
hello,大家好,我是叶秋! 上一期呢,给大家介绍了如何给树莓派安装系统,有细心的朋友就会发现上一期安装系统的文章漏了一点点知识,不知道机智的你是否有发现呢~~(尴尬
- 基于CentOS-6.9_x64系统QT环境搭建
想从事QT开发的人员,首先要做的第一件事就是开发环境的搭建.本人也是一位刚入门的新手,为了搭建这么一个环境,参考了很多的网上教程,然而中间依然走了不少弯路.现将过程记录下来. 一.开发环境 Ce ...

