PedestrainCounting
kmeans.h
1 #ifndef KMEANS_H
2 #define KMEANS_H
3 #pragma once
4 
5 #include <iostream>
6 #include <fstream>
7 #include <vector>
8 #include <math.h>
9 #include "opencv\highgui.h"
10 #include "opencv\cv.h"
11 
12 using namespace std;
13 
14 /*kmeans算法实现(考虑元组多个属性的情况)
15 *@File:kmeans.cpp
16 *@Author:Kan Chen (chenkan0007@gmail.com)
17 *@Create:2011-12-10
18 *@Last Modified:2013-05-07
19 */
20 
21 //const int NUM_clusters = 3;
22 const double THRES_Diff = 5.0e3;
23 const int THRES_ITERATION_TIMES = 150;
24 
25 //存放元组的属性信息
26 struct Tuple{
27  double attr1;
28  double attr2;
29  int num_elem;
30  double* data;
31 };
32 
33 struct row_data
34 {
35  double row;
36  int label;
37 };
38 
39 // 用于Kmeans中最后按照类别中元素数目从大到小排序的函数
40 bool lessmark(const row_data &s1, const row_data &s2);
41 
42 // 用于Kmeans中最后按照类别中元素数目从小到大排序的函数
43 bool greatermark(const row_data &s1, const row_data &s2);
44 
45 // 显示每个数据点信息的函数(用于调试)
46 void print_Tuple(Tuple tuple);
47 
48 // 初始化每个数据点void init_Tuple(Tuple &tuple, int num_element); // 将图像数据转换为数据点 void readin_data(Tuple &tuple, int num, CvMat* &Matdata); // 读取数据点的信息 void readout_data(Tuple &tuple, int frameH, int frameW); // 删除数据点 void delete_tuple(Tuple &tuple); //计算两个元组间的欧几里距离 double getDistXY(Tuple t1, Tuple t2); //根据质心,决定当前元组属于哪个簇 int clusterOfTuple(Tuple means[],Tuple tuple, int num_cluster); //获得给定簇集的平方误差 double getVar(Tuple* &tuples,Tuple means[], int num_cluster, vector<int>* labels); //获得当前簇的均值(质心) void cal_mean(Tuple* &cluster, Tuple & mean_tuple, vector<int> labels); //kMeans 算法实现 vector<int>* KMeans(Tuple* &tuples, int num_cluster, double thres_diff, int length); #endif
49 void init_Tuple(Tuple &tuple, int num_element);
50 
51 // 将图像数据转换为数据点void readin_data(Tuple &tuple, int num, CvMat* &Matdata); // 读取数据点的信息 void readout_data(Tuple &tuple, int frameH, int frameW); // 删除数据点 void delete_tuple(Tuple &tuple); //计算两个元组间的欧几里距离 double getDistXY(Tuple t1, Tuple t2); //根据质心,决定当前元组属于哪个簇 int clusterOfTuple(Tuple means[],Tuple tuple, int num_cluster); //获得给定簇集的平方误差 double getVar(Tuple* &tuples,Tuple means[], int num_cluster, vector<int>* labels); //获得当前簇的均值(质心) void cal_mean(Tuple* &cluster, Tuple & mean_tuple, vector<int> labels); //kMeans 算法实现 vector<int>* KMeans(Tuple* &tuples, int num_cluster, double thres_diff, int length); #endif
52 void readin_data(Tuple &tuple, int num, CvMat* &Matdata);
53 
54 // 读取数据点的信息
55 void readout_data(Tuple &tuple, int frameH, int frameW);
56 
57 // 删除数据点void delete_tuple(Tuple &tuple); //计算两个元组间的欧几里距离 double getDistXY(Tuple t1, Tuple t2); //根据质心,决定当前元组属于哪个簇 int clusterOfTuple(Tuple means[],Tuple tuple, int num_cluster); //获得给定簇集的平方误差 double getVar(Tuple* &tuples,Tuple means[], int num_cluster, vector<int>* labels); //获得当前簇的均值(质心) void cal_mean(Tuple* &cluster, Tuple & mean_tuple, vector<int> labels); //kMeans 算法实现 vector<int>* KMeans(Tuple* &tuples, int num_cluster, double thres_diff, int length); #endif
58 void delete_tuple(Tuple &tuple);
59 
60 //计算两个元组间的欧几里距离
61 double getDistXY(Tuple t1, Tuple t2);
62 
63 //根据质心,决定当前元组属于哪个簇
64 int clusterOfTuple(Tuple means[],Tuple tuple, int num_cluster);
65 
66 //获得给定簇集的平方误差
67 double getVar(Tuple* &tuples,Tuple means[], int num_cluster, vector<int>* labels);
68 
69 //获得当前簇的均值(质心)
70 void cal_mean(Tuple* &cluster, Tuple & mean_tuple, vector<int> labels);
71 
72 //kMeans 算法实现
73 vector<int>* KMeans(Tuple* &tuples, int num_cluster, double thres_diff, int length);
74 
75 #endif
Definition: kmeans.h:33
Definition: kmeans.h:26