Fnd类头文件Fnd.h: #include <iostream> #include <fstream> #include <string> #include <math.h> using namespace std; typedef unsigned char BYTE; #define HSIZE 256 #define VSIZE 256 class Fnd { private: char* unkimg; char* stdimg; double fnd; int position; public: Fnd(); Fnd(char *, char *); int setunkimg(char*); int setstdimg(char*); int setfnd(double ); int setposition(int ); char* getunkimg(); char* getstdimg(); double getfnd(); int getposition(); double calculatefnd();//计算待识别图像与标准图像的的分形邻距。 }; Fnd.cpp: #include "Fnd.h" Fnd::Fnd() { unkimg = "u"; stdimg = "s"; fnd = 0; } Fnd::Fnd(char* u, char* s) { unkimg = u; stdimg = s; fnd = 0; } int Fnd::setunkimg(char* u) { unkimg = u; return 0; } int Fnd::setstdimg(char* s) { stdimg = s; return 0; } int Fnd::setfnd(double f) { fnd = f; return 0; } int Fnd::setposition(int p) { position = p; return 0; } char* Fnd::getunkimg() { return unkimg; } char* Fnd::getstdimg() { return stdimg; } double Fnd::getfnd() { return fnd; } int Fnd::getposition() { return position; } double Fnd::calculatefnd() { /*----------分配二维数组----------*/ BYTE **unkdata; BYTE **stddata; unkdata = new BYTE*[HSIZE]; stddata = new BYTE*[HSIZE]; for(int i=0; i<HSIZE; i++) { unkdata[i] = new BYTE[VSIZE]; stddata[i] = new BYTE[VSIZE]; } /*----------------读取raw图像--------------*/ ifstream unkfile, stdfile; //setlocale(LC_ALL,"Chinese-simplified"); //resolve the problem that file with Chinese name cannot be opened unkfile.open(unkimg, ios::in); stdfile.open(stdimg, ios::in); if( !unkfile.is_open() ) { cout << " Calculatefnd() unkfile: OPEN FILE ERROR!" << endl; }else if( !stdfile.is_open() ) { cout << " Calculatefnd() stdfile: OPEN FILE "<< stdimg << " ERROR!" << endl; } for(int i=0; i<HSIZE; i++) { for(int j=0; j<VSIZE; j++) { unkfile.read((char*)&unkdata[i][j], sizeof(unkdata[i][j])); } } for(int i=0; i<HSIZE; i++) { for(int j=0; j<VSIZE; j++) { stdfile.read((char*)&stddata[i][j], sizeof(stddata[i][j])); } } unkfile.close(); stdfile.close(); /*----------计算分形邻矩----------*/ double sum = 0; for(int i=0; i<HSIZE; i++) { for(int j=0; j<VSIZE; j++) { sum+=(unkdata[i][j]-stddata[i][j])*(unkdata[i][j]-stddata[i][j]); } } fnd = sqrt(sum); /*----------释放二维数组----------*/ for(int i=0; i<HSIZE; i++) { delete []unkdata[i]; delete []stddata[i]; } delete []unkdata; delete []stddata; return fnd; } quicksort.cpp按分形邻距快速排序: #include "Fnd.h" #include <string> //Swap integer values by arr indexes void swap( Fnd * arr, int a, int b ) { double fndtem = arr[a].getfnd(); arr[a].setfnd(arr[b].getfnd()); arr[b].setfnd(fndtem); char* nametem = arr[a].getstdimg(); arr[a].setstdimg(arr[b].getstdimg()); arr[b].setstdimg(nametem); } //Find the index of the Median of the elements //of array that occur at every "shift" positions. int findMedianIndex( Fnd* arr, int left, int right, int shift ) { int i, groups = (right - left)/shift + 1, k = left + groups/2*shift; int minIndex, j; double minValue; for(i = left; i <= k; i+= shift) { minIndex = i; minValue = arr[minIndex].getfnd(); for(j = i; j <= right; j+=shift) if(arr[j].getfnd() < minValue) { minIndex = j; minValue = arr[minIndex].getfnd(); } swap(arr, i, minIndex); } return k; } //Computes the median of each group of 5 elements and stores //it as the first element of the group. Recursively does this //till there is only one group and hence only one Median double findMedianOfMedians( Fnd* arr, int left, int right ) { if(left == right) return arr[left].getfnd(); int i, shift = 1, endIndex, medianIndex; while(shift <= (right - left)) { for(i = left; i <= right; i+=shift*5) { endIndex = (i + shift*5 - 1 < right) ? i + shift*5 - 1 : right; medianIndex = findMedianIndex(arr, i, endIndex, shift); swap(arr, i, medianIndex); } shift *= 5; } return arr[left].getfnd(); } //Partition the array into two halves and return the //index about which the arr is partitioned int partition( Fnd* arr, int left, int right ) { //Makes the leftmost element a good pivot, //specifically the median of medians findMedianOfMedians(arr, left, right); int pivotIndex = left, index = left, i; double pivotValue = arr[pivotIndex].getfnd(); swap(arr, pivotIndex, right); for(i = left; i < right; i++) { if(arr[i].getfnd() < pivotValue) { swap(arr, i, index); index += 1; } } swap(arr, right, index); return index; } //Quicksort the arr void quicksort( Fnd* arr, int left, int right ) { if(left >= right) return; int index = partition(arr, left, right); quicksort(arr, left, index - 1); quicksort(arr, index + 1, right); } fndsort.cpp主程序: #include <iostream> #include <fstream> #include <string> #include "Fnd.h" using namespace std; extern void quicksort(Fnd*, int , int); int main(int argc, char ** argv) { ifstream infile(argv[2], ios::in);//argv[2] image path list. cout << argv[2]<< endl; if( !infile.is_open() ) { cerr << "OPEN FILE ERROR!" << endl; exit(1); } string path; int lnmb=0; while( getline(infile, path) ) { //cout<<"***:"<<path<<endl; lnmb++; } infile.clear();//clear the wrong status of infile set by function getline() infile.close(); infile.open(argv[2]);//now the pointer is at the beginning of infile Fnd *rslt = new Fnd[lnmb]; char *p; for(int i=0; i<lnmb; i++) { getline(infile, path); rslt[i].setunkimg(argv[1]);//argv[1] unknown image p = new char[path.size() + 1]; strcpy(p,path.c_str()); rslt[i].setstdimg(p); rslt[i].calculatefnd(); } for(int i=0; i<lnmb; i++) { cout << rslt[i].getstdimg() <<"/'s fnd: " << rslt[i].getfnd() << endl; } quicksort( rslt, 0, lnmb-1 ); cout << "sorting..." << endl; for(int i=0; i<lnmb; i++) { cout << rslt[i].getstdimg() <<"/'s fnd: " << rslt[i].getfnd() << endl; } delete []rslt; return 0; }