首先是讀入所有的圖片: //遞歸讀取目錄下全部文件 void getFiles(string path, vector <string > & files,string flag){ //文件句柄 long hFile = 0; //文件信息 struct _finddata_t fileinfo; string p; if((hFile = _findfirst(p.assign(path).append( "\\*").c_str(), &fileinfo)) != - 1){ do{ //如果是目錄,迭代之,如果不是,加入列表 if((fileinfo.attrib & _A_SUBDIR)){ if(strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0 && flag == "r") getFiles( p.assign(path).append( "\\").append(fileinfo.name), files,flag ); } else{ files.push_back(p.assign(path).append( "\\").append(fileinfo.name) ); } } while(_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } } //遞歸讀取目錄下全部圖片 void getFiles(string path, vector <Mat > & files,string flag){ vector <string > fileNames; getFiles(path,fileNames,flag); for ( int i = 0;i <fileNames.size();i ++){ Mat tmp = imread(fileNames[i]); if (tmp.rows > 0) //如果是圖片 files.push_back(tmp); } } //遞歸讀取目錄下全部圖片和名稱 void getFiles(string path, vector <pair <Mat,string >> & files,string flag){ vector <string > fileNames; getFiles(path,fileNames,flag); for ( int i = 0;i <fileNames.size();i ++){ Mat tmp = imread(fileNames[i]); if (tmp.rows > 0){ pair <Mat,string > apir; apir.first = tmp; apir.second = fileNames[i]; files.push_back(apir); } } } 然後是編寫hsv距離,這個參考以前的資料 double GetHsVDistance(Mat src_base,Mat src_test1){ Mat hsv_base; Mat hsv_test1; /// Convert to HSV cvtColor( src_base, hsv_base, COLOR_BGR2HSV ); cvtColor( src_test1, hsv_test1, COLOR_BGR2HSV ); /// Using 50 bins for hue and 60 for saturation int h_bins = 50; int s_bins = 60; int histSize[] = { h_bins, s_bins }; // hue varies from 0 to 179, saturation from 0 to 255 float h_ranges[] = { 0, 180 }; float s_ranges[] = { 0, 256 }; const float * ranges[] = { h_ranges, s_ranges }; // Use the o-th and 1-st channels int channels[] = { 0, 1 }; /// Histograms MatND hist_base; MatND hist_test1; /// Calculate the histograms for the HSV images calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false ); normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, - 1, Mat() ); calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false ); normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, - 1, Mat() ); /// Apply the histogram comparison methods double base_test1 = compareHist( hist_base, hist_test1, 0 ); return base_test1; }
int _tmain( int argc, _TCHAR * argv[]) { vector <pair <Mat,string >> imagepairs; vector < double > dresult; double dmax = 0; int imax = - 1; //讀入圖片 getFiles( "images",imagepairs); Mat src = imread( "images/0.jpg"); //距離測算 for ( int i = 0;i <imagepairs.size();i ++){ double tmp = GetHsVDistance(src,imagepairs[i].first); if (tmp == 1) tmp = 0; //不能搞自己 char cbuf[ 1024]; sprintf_s(cbuf, "dst/%d.jpg",i); dresult.push_back(tmp); //推入vecresult中 } //尋找前10個圖片 for ( int index = 0;index < 10;index ++){ for ( int i = 0;i <imagepairs.size();i ++){ if (dresult[i] >dmax){ dmax = dresult[i]; imax = i; } } char cbuf[ 1024]; sprintf_s(cbuf, "dst/%d.jpg",index); imwrite(cbuf,imagepairs[imax].first); dresult[imax] = 0; //剔出隊列 dmax = 0; imax = - 1; } printf( "OK"); waitKey(); return 0; }