ʹÓÃOpenCV±àдµÄLDA³ÌÐò----C++ LDA´úÂë(Ò»)

2014-11-24 13:23:11 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 77

¸Äд×ÔOpenCVÖеÄlda.cpp³ÌÐò£¬Í¨¹ý¸ÄдµÄ³ÌÐò¿ÉÒÔ·µ»Ø×Ô¼ºËùÐèµÄÐÅÏ¢£¨LDAËã·¨¹ý³ÌÖвúÉúµÄÎÒÃǸÐÐËȤµÄÖмäÖµ£©£¬ÊµÏÖËã·¨µÄ¶ÀÁ¢±àÒ룬Ҳ¿ÉÒÔͨ¹ýÔĶÁ³ÌÐò£¬¼ÓÉî¶ÔLDAËã·¨µÄÀí½â¡£

// main.cpp : ¶¨Òå¿ØÖÆÌ¨Ó¦ÓóÌÐòµÄÈë¿Úµã¡£
//

#include "stdafx.h"
#include 
  
   
#include 
   
     #include 
    
      #include "lda.h" using namespace std; using namespace cv; int main(void) { double data[6][2]={{0,1},{0,2},{1,4},{8,0},{8,2},{9,4}}; Mat dmat=Mat(6,2,CV_64FC1,data); int labels[6]={0, 0, 0, 1, 1, 1}; Mat lmat=Mat(1,6,CV_32SC1,labels); cout<<"--------------------------------"<
     
      

\

//lda.h

#ifndef  _MY_LDA_H
#define _MY_LDA_H

#include 
       
        
#include 
        
          using namespace std; using namespace cv; /********************* _src: ÊäÈëµÄ²ÉÑùÊý¾Ý£¬MatÀàÐÍ£¬Ã¿ÐÐÊÇÒ»¸öÑù±¾Êý¾Ý _lbls: ÊäÈëµÄÀà±ð±êÇ©£¬¿ÉÒÔÊǾØÕó»òÕßÏòÁ¿ »¹Ã»Óзµ»ØÖµ£¬ÐèÒªµÄÅóÓÑ¿ÉÒÔ×Ô¼º×ö½øÒ»²½¸Äд /********************/ extern void MyLDA(InputArrayOfArrays _src, InputArray _lbls); #endif 
        
       
//lda.cpp

#include "stdafx.h"
#include 
       
        
#include 
        
          #include 
         
           #include 
          
            using namespace cv; using namespace std; // Removes duplicate elements in a given vector. template
           
             inline vector<_Tp> remove_dups(const vector<_Tp>& src) { typedef typename set<_Tp>::const_iterator constSetIterator; typedef typename vector<_Tp>::const_iterator constVecIterator; set<_Tp> set_elems; for (constVecIterator it = src.begin(); it != src.end(); ++it) set_elems.insert(*it); vector<_Tp> elems; for (constSetIterator it = set_elems.begin(); it != set_elems.end(); ++it) elems.push_back(*it); return elems; } static Mat argsort(InputArray _src, bool ascending=true) { Mat src = _src.getMat(); if (src.rows != 1 && src.cols != 1) { string error_message = "Wrong shape of input matrix! Expected a matrix with one row or column."; CV_Error(CV_StsBadArg, error_message); } int flags = CV_SORT_EVERY_ROW+(ascending   CV_SORT_ASCENDING : CV_SORT_DESCENDING); Mat sorted_indices; sortIdx(src.reshape(1,1),sorted_indices,flags); return sorted_indices; } static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double beta=0) { // make sure the input data is a vector of matrices or vector of vector if(src.kind() != _InputArray::STD_VECTOR_MAT && src.kind() != _InputArray::STD_VECTOR_VECTOR) { string error_message = "The data is expected as InputArray::STD_VECTOR_MAT (a std::vector
            
             ) or _InputArray::STD_VECTOR_VECTOR (a std::vector< vector<...> >)."; CV_Error(CV_StsBadArg, error_message); } // number of samples size_t n = src.total(); // return empty matrix if no matrices given if(n == 0) return Mat(); // dimensionality of (reshaped) samples size_t d = src.getMat(0).total(); // create data matrix Mat data((int)n, (int)d, rtype); // now copy data for(int i = 0; i < (int)n; i++) { // make sure data can be reshaped, throw exception if not! if(src.getMat(i).total() != d) { string error_message = format("Wrong number of elements in matrix #%d! Expected %d was %d.", i, (int)d, (int)src.getMat(i).total()); CV_Error(CV_StsBadArg, error_message); } // get a hold of the current row Mat xi = data.row(i); // make reshape happy by cloning for non-continuous matrices if(src.getMat(i).isContinuous()) { src.getMat(i).reshape(1, 1).convertTo(xi, rtype, alpha, beta); } else { src.getMat(i).clone().reshape(1, 1).convertTo(xi, rtype, alpha, beta); } } return data; } static void sortMatrixColumnsByIndices(InputArray _src, InputArray _indices, OutputArray _dst) { if(_indices.getMat().type() != CV_32SC1) { CV_Error(CV_StsUnsupportedFormat, "cv::sortColumnsByIndices only works on integer indices!"); } Mat src = _src.getMat(); vector
             
               indices = _indices.getMat(); _dst.create(src.rows, src.cols, src.type()); Mat dst = _dst.getMat(); for(size_t idx = 0; idx < indices.size(); idx++) { Mat originalCol = src.col(indices[idx]); Mat sortedCol = dst.col((int)idx); originalCol.copyTo(sortedCol); } } static Mat sortMatrixColumnsByIndices(InputArray src, InputArray indices) { Mat dst; sortMatrixColumnsByIndices(src, indices, dst); return dst; } template
              
                static bool isSymmetric_(InputArray src) { Mat _src = src.getMat(); if(_src.cols != _src.rows) return false; for (int i = 0; i < _src.rows; i++) { for (int j = 0; j < _src.cols; j++) { _Tp a = _src.at<_Tp> (i, j); _Tp b = _src.at<_Tp> (j, i); if (a != b) { return false; } } } return true; } template
               
                 static bool isSymmetric_(InputArray src, double eps) { Mat _src = src.getMat(); if(_src.cols != _src.rows) return false; for (int i = 0; i < _src.rows; i++) { for (int j = 0; j < _src.cols; j++) { _Tp a = _src.at<_Tp> (i, j); _Tp b = _src.at<_Tp> (j, i); if (std::abs(a - b) > eps) { return false; } } } return true; } static bool isSymmetric(InputArray src, double eps=1e-16) { Mat m = src.getMat(); switch (m.type()) { case CV_8SC1: return isSymmetric_
                
                 (m); break; case CV_8UC1: return isSymmetric_
                 
                  (m); break; case CV_16SC1: return isSymmetric_
                  
                   (m); break; case CV_16UC1: return isSymmetric_
                   
                    (m); break; case CV_32SC1: return isSymmetric_
                    
                     (m); break; case CV_32FC1: return isSymmetric_