配置文件解析方法总结

本文用于总结如何解析配置文件,逐步更新。

(一) 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. */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值