首页 > 代码库 > 使用OpenCV编写的LDA程序----C++ LDA代码

使用OpenCV编写的LDA程序----C++ LDA代码

改写自OpenCV中的lda.cpp程序,通过改写的程序可以返回自己所需的信息(LDA算法过程中产生的我们感兴趣的中间值),实现算法的独立编译,也可以通过阅读程序,加深对LDA算法的理解。

// main.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <cxcore.hpp>
#include <vector>
#include <iostream>
#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<<"--------------------------------"<<endl;

	MyLDA(dmat, lmat); 

	system("pause");
	return 0;
}


//lda.h

#ifndef  _MY_LDA_H
#define _MY_LDA_H

#include <cxcore.hpp>
#include <vector>
using namespace std;
using namespace cv;

/*********************
 _src:
 输入的采样数据,Mat类型,每行是一个样本数据
 _lbls:
 输入的类别标签,可以是矩阵或者向量

 还没有返回值,需要的朋友可以自己做进一步改写
/********************/
extern void MyLDA(InputArrayOfArrays _src, InputArray _lbls);

#endif 
//lda.cpp

#include "stdafx.h"
#include <cxcore.hpp>
#include <vector>
#include <set>
#include <iostream>
using namespace cv;
using namespace std;

// Removes duplicate elements in a given vector.
template<typename _Tp>
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 = http://www.mamicode.com/_src.getMat();>