Descriptor EuclidianMetric::getCentroid(std::vector<FeaturePoint> &vecFeaturePoint, std::vector<int> &vecIdList) { if (vecIdList.empty()) throw std::runtime_error("Error: cluster is empty!"); int sizeDesc = vecFeaturePoint[0].descriptor().size(); Descriptor bufValue(sizeDesc); int countRec = vecIdList.size(); for (int i = 0; i < sizeDesc; i++) { double result = 0; for (int j = 0; j < countRec; j++) result += vecFeaturePoint[vecIdList[j]].descriptor()[i]; bufValue[i] = result / countRec; } return bufValue; }
void ConfigProperty::ConfigInit(int argc, char* argv[]) { std::string strCfgFile; std::vector< std::string > cmdDefs; if(argc > 0) { m_vtOtherArgs.push_back(argv[0]); char ch; while((ch = getopt(argc, argv, "c:D:")) != -1) { switch(ch) { case 'c': strCfgFile = optarg; break; case 'D': cmdDefs.push_back(optarg); break; // 忽略无效选项 case '?': break; default: if(optarg) { m_vtOtherArgs.push_back(optarg); } break; } } } // 定义缓冲区 Buffer bufTmp(1024); Buffer bufLine(1024); Buffer bufName(256); Buffer bufValue(1024 * 1024); // 定义要解析的文件 std::vector< std::string > cfgFiles; std::string str = GetPreConfigFile(); if(str.length() > 0) { const char* p = getenv(str.c_str()); if(p != NULL && strlen(p) > 0) { cfgFiles.push_back(p); } } if(strCfgFile.length() > 0) { cfgFiles.push_back(strCfgFile); } // 先解析文件 for(size_t k = 0; k < cfgFiles.size(); k++) { FILE* fp = fopen(cfgFiles[k].c_str(), "r"); if(fp != NULL) { while(!feof(fp)) { bufTmp.Reset(); bufLine.Reset(); bufName.Reset(); bufValue.Reset(); if(fgets(bufTmp.Inout(), bufTmp.Capacity() - 1, fp) != NULL) { // 去掉注释 int code = sscanf(bufTmp.Inout(), "%[^#\n]", bufLine.Inout()); if(code != 1) { continue; } // 分割成name/value code = sscanf(bufLine.Inout(), "%[^ =]%*[ =]%[^$]", bufName.Inout(), bufValue.Inout()); if(code != 2) { continue; } // 保存解析好的name/value m_OptionProperty[StringUtil::TrimAll(bufName.Inout())] = StringUtil::TrimAll(bufValue.Inout()); } } fclose(fp); } else { throw LWPR::LWPR_FILE_NOT_EXIST(EXCEPTION_THREAD_TRACE, 0, "fopen error"); } } // 再解析命令行 for(size_t i = 0; i < cmdDefs.size(); i++) { bufName.Reset(); bufValue.Reset(); // 分割成name/value int code = sscanf(cmdDefs[i].c_str(), "%[^ =]%*[ =]%[^$]", bufName.Inout(), bufValue.Inout()); if(code != 2) { continue; } // 保存解析好的name/value m_OptionProperty[StringUtil::TrimAll(bufName.Inout())] = StringUtil::TrimAll(bufValue.Inout()); } DoPropConstruct(); }