最近用到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. IOS中Hybird实现

    现在Hybird这块,网上也有很多文章,最近研究了下,分享给大家. 什么是Hybird技术? 1.一般是指WebView和Native技术混合而成的一套技术方案 2.也可以理解成,非Native技术与 ...

  2. iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...

  3. mysql 配置安装

    1.     下载: mysql-5.7.20是解压版免安装的,mysql-5.7.20下载地址:http://dev.mysql.com/downloads/mysql/ 直接下载,无需注册和登录. ...

  4. Java中泛型的运用实例

    package example6; import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;impor ...

  5. Laravel 生成二维码

    (本实例laravel 版本 >=5.6, PHP版本 >=7.0) 1.首先,添加 QrCode 包添加到你的 composer.json 文件的 require 里: "re ...

  6. Python3简单登录接口编写及遇到的问题分享

    1.程序目标 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 2.思路 利用python中的pickle模块,实现用户登录信息(采用dict)和被锁定用户信息(采用list)的存储.所以我预先 ...

  7. Android编译命令

    目录 说在前面 编译流程 编译指令 代码编译 代码检索 其他指令 说在前面 从最开始接触Android系统开始,每次进行代码编译都需要网上搜索编译指令.后来大致熟悉了Android的编译体系,加深了对 ...

  8. MFC非模态添加进程控件方法二(自定义消息方法)

    以下内容有大部分转载自CSDN,经过自己整理完成. 该文主要的方法为在非模态对话框中自定义一组消息函数,然后在主窗口中开辟一个线程通过线程把消息传递给子窗口进行更新. 在子窗口类中定义消息如下: /* ...

  9. Java 8 中有趣的操作 Stream

    Stream 不是java io中的stream 对象创建 我们没有必要使用一个迭代来创建对象,直接使用流就可以 String[] strs = {"haha","hoh ...

  10. HyperLedger Fabric 1.4 多机多节点部署(10.3)

    多机多节点指在多台电脑上部署多个组织和节点,本案例部署一个排序(orderer)服务,两个组织(org1,org2)和四个节点(peer),每个组织包括两个节点,需要五台计算机,计算机配置如下: 多机 ...