Пример #1
0
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;
}
Пример #2
0
	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();
	}