最近用到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

https://docs.opencv.org/2.4/modules/core/doc/old_basic_structures.html?highlight=cvset#void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value)

OpenCV学习4-----K-Nearest Neighbors(KNN)demo的更多相关文章

  1. [机器学习系列] k-近邻算法(K–nearest neighbors)

    C++ with Machine Learning -K–nearest neighbors 我本想写C++与人工智能,但是转念一想,人工智能范围太大了,我根本介绍不完也没能力介绍完,所以还是取了他的 ...

  2. 转载: scikit-learn学习之K最近邻算法(KNN)

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  3. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  4. 学习笔记之k-nearest neighbors algorithm (k-NN)

    k-nearest neighbors algorithm - Wikipedia https://en.wikipedia.org/wiki/K-nearest_neighbors_algorith ...

  5. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  6. OpenCV 学习笔记 06 图像检索以及基于图像描述符的搜索

    OpenCV 可以检测图像的主要特征,然后提取这些特征,使其成为图像描述符,这些图像特征可作为图像搜索的数据库:此外可以利用关键点将图像拼接 stitch 起来,组成一个更大的图像.如将各照片组成一个 ...

  7. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  8. 机器学习--K近邻 (KNN)算法的原理及优缺点

    一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...

  9. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  10. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

随机推荐

  1. 自己封装了的AlertController

    一直觉得使用系统这个东西写起来特别麻烦,每次都要写一大推东西,还是重复的,今天抽了点时间自己重新封装了一下,解决了自己的强迫症...,不多说,直接上代码了. 1.自己定义了一个名为XBZ的UIAler ...

  2. 浅谈React和VDom关系

    组件化 组件的封装 组件的复用 组件的封装 视图 数据 视图和数据之间的变化逻辑 import React, {Component} from 'react'; export default clas ...

  3. .Net core 使用Swagger

    接触到项目的时候,用了很久的Swagger,发现Swagger真的非常好用,不但方便了调试Web Api,还生成了Api 文档,真是非常的好用啊. 然后我想搞懂到底如何使用Swagger,所以自己建了 ...

  4. CentOS 7.x eth0

    1:Test Environment [root@linux-node1 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server rel ...

  5. tcp总结与简单实现

    一.TCP简介 1. TCP介绍 1)TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议 2)t ...

  6. mysql 主主架构,多入口 互为备份

    ,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mysql入口,增加高可用.不过多主需要考虑自增长ID ...

  7. php 遍历一个文件夹下的所有文件和子文件

    php 遍历一个文件夹下的所有文件和子文件 <?php /** * 将读取到的目录以数组的形式展现出来 * @return array * opendir() 函数打开一个目录句柄,可由 clo ...

  8. ES6 imports用法

    import defaultExport from "module-name"; import * as name from "module-name"; // ...

  9. windows 10 安装node.js

    第一步:下载软件 nodejs的中文官网http://nodejs.cn/download/ 选择 windows  系统 msi 安装版本. 下载完成之后,直接打开下一步安装就可以. 安装完成 打开 ...

  10. hive常见的几种优化手段

    Hive调优的几个入手点: Hive是基于Hadoop框架的,Hadoop框架又是运行在JVM中的,而JVM最终是要运行在操作系统之上的,所以,Hive的调优可以通过如下几个方面入手: 操作系统调优 ...