本文用于总结如何解析配置文件,逐步更新。
(一) google.protocolbuffer
bool success = google::protobuf::TextFormat::Parse(input, proto);
可以从配置文件读取配置信息,并将数据封装到Message中。注意这里的message需要在proto中定义;即使配置文件中item的顺序与message中的顺序不一致也不要紧。
使用前提是使用第三方库:protocolbuffer
(二) QT
(三)opencv
使用CvFileStorage 来实现对配置文件的读写操作,当然这个是c接口,也可以使用opencv提供的C++接口类。
读配置文件
void VehicleCouting::loadConfig()
{
CvFileStorage* fs = cvOpenFileStorage("../config/VehicleCouting.xml", 0, CV_STORAGE_READ);
showOutput = cvReadIntByName(fs, 0, "showOutput", true);
showAB = cvReadIntByName(fs, 0, "showAB", 1);
use_roi = cvReadIntByName(fs, 0, "fav1_use_roi", true);
roi_defined = cvReadIntByName(fs, 0, "fav1_roi_defined", false);
roi_x0 = cvReadIntByName(fs, 0, "fav1_roi_x0", 0);
roi_y0 = cvReadIntByName(fs, 0, "fav1_roi_y0", 0);
roi_x1 = cvReadIntByName(fs, 0, "fav1_roi_x1", 0);
roi_y1 = cvReadIntByName(fs, 0, "fav1_roi_y1", 0);
m_iLaneNum = cvReadIntByName(fs,0,"LaneNum",1);
m_pPoint1[0].x = cvReadIntByName(fs,0,"AX1",0);
m_pPoint1[0].y = cvReadIntByName(fs,0,"AY1",0);
m_pPoint1[1].x = cvReadIntByName(fs,0,"AX2",0);
m_pPoint1[1].y = cvReadIntByName(fs,0,"AY2",0);
m_pPoint1[2].x = cvReadIntByName(fs,0,"AX3",0);
m_pPoint1[2].y = cvReadIntByName(fs,0,"AY3",0);
m_pPoint1[3].x = cvReadIntByName(fs,0,"AX4",0);
m_pPoint1[3].y = cvReadIntByName(fs,0,"AY4",0);
if (m_iLaneNum ==2 )
{
m_pPoint2[0].x = cvReadIntByName(fs,0,"BX1",0);
m_pPoint2[0].y = cvReadIntByName(fs,0,"BY1",0);
m_pPoint2[1].x = cvReadIntByName(fs,0,"BX2",0);
m_pPoint2[1].y = cvReadIntByName(fs,0,"BY2",0);
m_pPoint2[2].x = cvReadIntByName(fs,0,"BX3",0);
m_pPoint2[2].y = cvReadIntByName(fs,0,"BY3",0);
m_pPoint2[3].x = cvReadIntByName(fs,0,"BX4",0);
m_pPoint2[3].y = cvReadIntByName(fs,0,"BY4",0);
}
cvReleaseFileStorage(&fs);
}
写配置文件
void VehicleCouting::saveConfig()
{
CvFileStorage* fs = cvOpenFileStorage("./config/VehicleCouting.xml", 0, CV_STORAGE_WRITE);
cvWriteInt(fs, "showOutput", showOutput);
cvWriteInt(fs, "showAB", showAB);
cvWriteInt(fs, "fav1_use_roi", use_roi);
cvWriteInt(fs, "fav1_roi_defined", roi_defined);
cvWriteInt(fs, "fav1_roi_x0", roi_x0);
cvWriteInt(fs, "fav1_roi_y0", roi_y0);
cvWriteInt(fs, "fav1_roi_x1", roi_x1);
cvWriteInt(fs, "fav1_roi_y1", roi_y1);
cvReleaseFileStorage(&fs);
}
配置文件样式
<?xml version="1.0"?>
<opencv_storage>
<showOutput>1</showOutput>
<showAB>0</showAB>
<fav1_use_roi>1</fav1_use_roi>
<fav1_roi_defined>1</fav1_roi_defined>
<fav1_roi_x0>350</fav1_roi_x0>
<fav1_roi_y0>300</fav1_roi_y0>
<fav1_roi_x1>40</fav1_roi_x1>
<fav1_roi_y1>300</fav1_roi_y1>
<LaneNum>1</LaneNum>
<AX1>296</AX1>
<AY1>143</AY1>
<AX2>229</AX2>
<AY2>343</AY2>
<AX3>378</AX3>
<AY3>342</AY3>
<AX4>358</AX4>
<AY4>138</AY4>
<BX1>350</BX1>
<BY1>100</BY1>
<BX2>370</BX2>
<BY2>380</BY2>
<BX3>600</BX3>
<BY3>380</BY3>
<BX4>450</BX4>
<BY4>100</BY4>
</opencv_storage>
(四)通用的C代码
主要思想:就是以“=”为分割,左边是key,右边是value。这里要预先定义好key,属于硬编码。
{ /* Parse arguments: */
int i;
for(i=1; i<argc; ++i)
{
int bParsed = 0;
size_t len = strlen(argv[i]);
#define RO(_n1,_n2) if(strncmp(argv[i],_n1,strlen(_n1))==0) {_n2 = argv[i]+strlen(_n1);bParsed=1;};// 宏定义,若是n1输入等于字符串 ,那么赋值给n2
RO("fg=",fg_name);
RO("fgavi=",fgavi_name);
RO("btavi=",btavi_name);
RO("bd=",bd_name);
RO("bt=",bt_name);
RO("bt_corr=",bt_corr);
RO("btpp=",btpp_name);
RO("bta=",bta_name);
RO("bta_data=",bta_data_name);
RO("btgen=",btgen_name);
RO("track=",track_name);
//RO("comment=",comment_name);
RO("FGTrainFrames=",FGTrainFrames);
RO("log=",log_name);
RO("savestate=",savestate_name);
RO("loadstate=",loadstate_name);
RO("VC=",vc_name);// add by bhj: 获取VC= 对应的值
RO("VP=",vp_name);// add by bhj: 获取VC= 对应的值
#undef RO
{
char* ext = argv[i] + len-4;
if( strrchr(argv[i],'=') == NULL &&
!bParsed &&
(len>3 && (MY_STRICMP(ext,".avi") == 0 )))
{
avi_name = argv[i];
break;
}
} /* Next argument. */
}
} /* Parse arguments. */