Go to the documentation of this file.00001 #ifndef SSA_H_
00002 #define SSA_H_
00003
00004 #include <opencv2/opencv.hpp>
00005 #include <iostream>
00006 #include <fstream>
00007 #include <ostream>
00008 #include <limits>
00009 #include <math.h>
00010
00011 namespace SubspaceAnalysis
00012 {
00013
00014
00015 class SSA
00016 {
00017
00018 public:
00019 SSA()
00020 {
00021 }
00022 ;
00023
00024 virtual ~SSA()
00025 {
00026 }
00027 ;
00028 void calcDataMat(std::vector<cv::Mat>& input_data, cv::Mat& data_mat);
00029 void calcDataMatMean(cv::Mat& data, cv::Mat& mean_row);
00030 void decomposeSVD(cv::Mat& data_mat);
00031 void decomposeSymmetricMatrix(cv::Mat& data_mat);
00032 void decomposeAsymmetricMatrix(cv::Mat& data_mat);
00033
00034 void retrieve(cv::Mat& proj, cv::Mat& avg, cv::Mat& proj_model_data);
00035
00036 cv::Mat eigenvals;
00037 cv::Mat eigenvecs;
00038 cv::Mat mean;
00039 int ss_dim_;
00040 };
00041
00042 class PCA2D: public SSA
00043 {
00044
00045 public:
00046 PCA2D()
00047 {
00048 }
00049 ;
00050 PCA2D(std::vector<cv::Mat>& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00051 virtual ~PCA2D()
00052 {
00053 }
00054 ;
00055
00056 int num_classes_;
00057 std::vector<int> unique_labels_;
00058
00059 cv::Mat class_mean_arr;
00060 };
00061 class LDA2D: public SSA
00062 {
00063
00064 public:
00065 LDA2D()
00066 {
00067 }
00068 ;
00069 LDA2D(std::vector<cv::Mat>& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00070 virtual ~LDA2D()
00071 {
00072 }
00073 ;
00074
00075 int num_classes_;
00076 std::vector<int> unique_labels_;
00077
00078 cv::Mat class_mean_arr;
00079 };
00080
00081 class LDA: public SSA
00082 {
00083
00084 public:
00085 LDA()
00086 {
00087 }
00088 ;
00089 LDA(cv::Mat& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00090 virtual ~LDA()
00091 {
00092 }
00093 ;
00094
00095 void calcClassMean(cv::Mat& data_mat, std::vector<int>& label_vec, cv::Mat& class_mean_arr, int& num_classes);
00096 void calcClassMean(cv::Mat& data_mat, cv::Mat& label_mat, cv::Mat& class_mean_arr, int& num_classes);
00097 virtual void calcProjMatrix(cv::Mat& data_arr, std::vector<int>& label_vec);
00098
00099 int num_classes_;
00100 std::vector<int> unique_labels_;
00101
00102 cv::Mat class_mean_arr;
00103 };
00104
00105 class ILDA: public LDA
00106 {
00107 public:
00108 ILDA()
00109 {
00110 }
00111 ;
00112 ILDA(cv::Mat& input_data, std::vector<int>& input_labels, int& num_classes, int& ss_dim);
00113 virtual ~ILDA()
00114 {
00115 }
00116 ;
00117
00118 virtual void calcProjMatrix(cv::Mat& data_arr, std::vector<int>& label_vec);
00119
00120 };
00121
00122 class PCA: public SSA
00123 {
00124 public:
00125 PCA()
00126 {
00127 }
00128 ;
00129 PCA(cv::Mat& input_data, int& ss_dim);
00130 virtual ~PCA()
00131 {
00132 }
00133 ;
00134 virtual void calcProjMatrix(cv::Mat& data);
00135 void PCA_OpenCv(cv::Mat& input_data, int& ss_dim);
00136 };
00137
00138
00139
00140
00141
00142
00143
00144
00145 void dump_matrix(cv::Mat& mat, std::string filename);
00146 void condense_labels(std::vector<int>& labels);
00147
00148 void error_prompt(std::string fct, std::string desc);
00149 void unique_elements(std::vector<int> & vec, int& unique_elements, std::vector<int>& distinct_vec);
00150 void unique_elements(cv::Mat & mat, int& unique_elements, std::vector<int>& distinct_vec);
00151
00152 void mat_info(cv::Mat& mat);
00153 void mat2arr(cv::Mat& src_mat, cv::Mat& dst_mat);
00154
00155 template<class T>
00156 void process_labels(std::vector<T> src_vec, cv::Mat& dst_labels)
00157 {
00158
00159 dst_labels = cv::Mat::zeros(1, src_vec.size(), CV_32FC1);
00160 dst_labels -= 1;
00161 bool unique;
00162 for (int i = 0; i < src_vec.size(); ++i)
00163 {
00164 unique = true;
00165 for (int j = 0; j < dst_labels.rows; j++)
00166 {
00167 if (i == 0)
00168 {
00169 break;
00170 }
00171 else if (src_vec[i] == src_vec[j])
00172 {
00173 unique = false;
00174 dst_labels.at<float>(i) = dst_labels.at<float>(j);
00175 break;
00176 }
00177 else
00178 continue;
00179 }
00180 if (unique == true)
00181 dst_labels.at<float>(i) = (float)i;
00182 }
00183
00184 }
00185
00186 }
00187 ;
00188 #endif