opencv K邻近分类器的使用

下面是手册中给出的K邻近分类器使用的例子,该例子是以CvMat形式实现的。通过下面的例子可以知道如何使用Opencv自带的分类器、矩阵数据如何访问、如何画图、如何使用Opencv的随机数生成函数等内容。在第二个例子中已将这些代码部分做了注释。

#include "ml.h"
#include "highgui.h"
int main( int argc, char** argv )
{
const int K = 10;
int i, j, k, accuracy;
float response;
int train_sample_count = 100;
CvRNG rng_state = cvRNG( - 1);
CvMat* trainData = cvCreateMat( train_sample_count, 2, CV_32FC1 );
CvMat* trainClasses = cvCreateMat( train_sample_count, 1, CV_32FC1 );
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
float _sample[ 2];
CvMat sample = cvMat( 1, 2, CV_32FC1, _sample );
cvZero( img );
CvMat trainData1, trainData2, trainClasses1, trainClasses2;
// form the training samples
cvGetRows( trainData, &trainData1, 0, train_sample_count/2 );
cvRandArr( &rng_state, &trainData1, CV_RAND_NORMAL, cvScalar( 200, 200), cvScalar( 50, 50) );
cvGetRows( trainData, &trainData2, train_sample_count/2, train_sample_count );
cvRandArr( &rng_state, &trainData2, CV_RAND_NORMAL, cvScalar( 300, 300), cvScalar( 50, 50) );
cvGetRows( trainClasses, &trainClasses1, 0, train_sample_count/2 );
cvSet( &trainClasses1, cvScalar( 1) );
cvGetRows( trainClasses, &trainClasses2, train_sample_count/2, train_sample_count );
cvSet( &trainClasses2, cvScalar( 2) );
// learn classifier
CvKNearest knn( trainData, trainClasses, 0, false, K );
CvMat* nearests = cvCreateMat( 1, K, CV_32FC1);
for( i = 0; i < img- >height; i++ )
{
for( j = 0; j < img- >width; j ++ )
{
sample.data.fl[ 0] = ( float)j;
sample.data.fl[ 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- >data.fl[k] == response)
accuracy++;
}
// highlight the pixel depending on the accuracy (or confidence)
cvSet2D( img, i, j, response == 1 ?
(accuracy > 5 ? CV_RGB( 180, 0, 0) : CV_RGB( 180, 120, 0)) :
(accuracy > 5 ? CV_RGB( 0, 180, 0) : CV_RGB( 120, 120, 0)) );
}
}
// display the original training samples
for( i = 0; i < train_sample_count/2; i++ )
{
CvPoint pt;
pt.x = cvRound(trainData1.data.fl[i*2]);
pt.y = cvRound(trainData1.data.fl[i*2+1]);
cvCircle( img, pt, 2, CV_RGB( 255, 0, 0), CV_FILLED );
pt.x = cvRound(trainData2.data.fl[i*2]);
pt.y = cvRound(trainData2.data.fl[i*2+1]);
cvCircle( img, pt, 2, CV_RGB( 0, 255, 0), CV_FILLED );
}
cvNamedWindow( " classifier result" , 1 );
cvShowImage( " classifier result" , img );
cvWaitKey( 0);
cvReleaseMat( &trainClasses );
cvReleaseMat( &trainData );
return 0;
}

下面是自己修改的基于Mat数据类型的K邻近分类器使用例子

#include <opencv.hpp>
int main( int argc, char** argv )
{
const int K = 10;
int i, j, k, accuracy;
float response;
int train_sample_count = 100;
RNG rng_state = RNG( - 1);
//如何使用随机函数
Mat trainData=Mat::zeros( train_sample_count, 2, CV_32FC1 );
Mat trainClasses =Mat::zeros( train_sample_count, 1, CV_32FC1 );
Mat img = Mat::zeros( 500,500,CV_8UC3);
float _sample[ 2];
Mat sample=Mat( 1, 2, CV_32FC1, _sample );
Mat trainData1, trainData2, trainClasses1, trainClasses2;

// form the training samples
trainData1=trainData.rowRange(0,train_sample_count/2);
//如何从已有矩阵中提取部分矩阵
rng_state.fill( trainData1, CV_RAND_NORMAL,Mat(1,1,CV_64F,cvScalar(200, 200)), Mat(1,1,CV_64F,cvScalar(50, 50)) );
//如何利用随机函数赋值已有矩阵
trainData2=trainData.rowRange(train_sample_count/2,train_sample_count);
rng_state.fill( trainData2, CV_RAND_NORMAL,Mat(1,1,CV_64F,cvScalar(300, 300)), Mat(1,1,CV_64F,cvScalar(50, 50)) );
trainClasses1=trainClasses.rowRange(0,train_sample_count/2);
trainClasses1.setTo(Scalar( 1));
//如何初始化矩阵为同一个数值
trainClasses2=trainClasses.rowRange(train_sample_count/2,train_sample_count);
trainClasses2.setTo(Scalar( 2));
// learn classifier
CvKNearest knn( trainData, trainClasses,Mat(), false, K );
//如何建立分类器的训练对象
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<Vec3b>(i,j)[2]=response == 1 ?(accuracy>5?180:180):(accuracy>5?0:120);
//如何访问多通道的矩阵
img.at<Vec3b>(i,j)[1]=response == 1 ?(accuracy>5?0:120):(accuracy>5?180:120);
img.at<Vec3b>(i,j)[0]=response == 1 ?(accuracy>5?0:0):(accuracy>5?0:0);
}
}
// display the original training samples
for( i = 0; i < train_sample_count/2; i++ )
{
CvPoint pt;
pt.x = cvRound(trainData1.at<float>(i,0));
pt.y = cvRound(trainData1.at<float>(i,1));
circle( img, pt, 2, CV_RGB( 255, 0, 0), CV_FILLED );
//在Mat数据类型中画图
pt.x = cvRound(trainData2.at<float>(i,0));
pt.y = cvRound(trainData2.at<float>(i,1));
circle( img, pt, 2, CV_RGB( 0, 255, 0), CV_FILLED );
}

imshow( " classifier result" , img );
cvWaitKey( 0);

return 0;
}

下面是分类器分类结果

时间: 2024-08-01 22:36:07

opencv K邻近分类器的使用的相关文章

OpenCV Machine Learning 之 K最近邻分类器 K-Nearest Neighbors

K-Nearest Neighbors 该算法存储所有的训练样本(已知标签),然后通过分析新给的样本(标签未知)与已知标签的训练样本的相似度,选出其中的K个最相似的训练样本进行投票得到新样本的标签,并计算加权和等. 该方法有时被称为是"learning by example",因为他总是根据新样本的特征向量与已知标签的样本特征向量的相似度来判断新样本的类别. CvKNearest class CvKNearest : public CvStatModel 该类实现了 K-Nearest

OpenCV Machine Learning 之 K最近邻分类器的应用 K-Nearest Neighbors

OpenCV Machine Learning 之 K最近邻分类器的应用 下面的程序实现了对高斯分布的点集合进行分类的K最近令分类器 程序运行结果: OpenCV Machine Learning 之 K最近邻分类器的应用 K-Nearest Neighbors,布布扣,bubuko.com

《机器学习实战》学习笔记一K邻近算法

 一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征(向量的每个元素)与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的的分类标签.由于样本集可以很大,我们选取前k个最相似数据,然后统计k个数据中出现频率最高的标签为新数据的标签. K邻近算法的一般流程: (1)收集数据:可以是本地数据,也可以从网页抓取. (2)准备数

机器学习 —— 基础整理(三):非参数方法——Parzen窗估计、k近邻估计;k近邻分类器

本文简述了以下内容: (一)非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻算法(k-nearest neighbor,kNN) (一)非参数方法(Non-parametric method) 对于生成模型来说,重要的地方在于类条件概率密度 $p(\textbf x|\omega_i)$ 的估计.上一篇介绍的参数方法,假定其是一个固定的分布密度形式,然后估计这个显式表达的函数中未知的参数.但这里存在两个问题:首先,假定的形式可能是不准确的,实际数据并不符合这个假设:其次,经典

k邻近算法

3.1k邻近算法 给定一个训练数据集,对于新的输入实例,在训练数据集中找到该实例最近的K 的实例,这k个实例的多数属于某个类,酒吧该输入实例分为这个类. 算法3.1 输入:训练数据集 其中xi为实例的特征向量,yi为实例的类别, 输出:实例x的类y (1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这个K个点的x的邻域记做Nk(x): (2)在Nk(x)中根据分类决策规则(如多数表决决定x的类别y): I为指示函数,当yi=cj时,I为1,否则I为0. k邻近算法的特殊情况是k=

机器学习之路: python k近邻分类器 鸢尾花分类预测

使用python语言 学习k近邻分类器的api 欢迎来到我的git查看源代码: https://github.com/linyi0604/kaggle 1 from sklearn.datasets import load_iris 2 from sklearn.cross_validation import train_test_split 3 from sklearn.preprocessing import StandardScaler 4 from sklearn.neighbors i

opencv 之 icvCreateHidHaarClassifierCascade 分类器信息初始化函数部分详细代码注释。

请看注释.这个函数,是人脸识别主函数,里面出现过的函数之一,作用是初始化分类器的数据,就是一个xml文件的数据初始化. 1 static CvHidHaarClassifierCascade* icvCreateHidHaarClassifierCascade( CvHaarClassifierCascade* cascade ) 2 { 3 CvRect* ipp_features = 0;//定义一个矩形框指针 4 float *ipp_weights = 0, *ipp_threshold

opencv 支持向量机SVM分类器

支持向量机SVM是从线性可分情况下的最优分类面提出的.所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类间隔最大实际上就是使得推广性中的置信范围最小.推广到高维空间,最优分类线就成为最优分类面. 支持向量机是利用分类间隔的思想进行训练的,它依赖于对数据的预处理,即,在更高维的空间表达原始模式.通过适当的到一个足够高维的非线性映射,分别属于两类的原始数据就能够被一个超平面来分隔.如下图所示: 空心点和

机器学习-scikit learn学习笔记

scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习问题一般可以分为: 监督学习(supervised learning) 分类(classification) 回归(regression) 非监督学习(unsupervised learning) 聚类(clustering) 监督学习和非监督学习的区别就是,监督学习中,样本数据会包含要预测的标签(