簡體   English   中英

在OpenCV中從文件讀取算法參數

[英]Reading algorithm parameters from file in OpenCV

我正在嘗試從XML文件中讀取經過訓練的Expectation Maximization模型的參數,以供以后使用。 為了存儲模型,我打電話給

cv::FileStorage fs("model.xml",cv::FileStorage::WRITE);
classifier.write(fs);  //classifier is of type cv::EM

這將創建包含看起來像模型數據的文件。 這是文件的樣子(從頭開始的前幾行):

StatModel.EM 1
<_ type_id="opencv-matrix"> 3 3 d
1.2159868951764311e+01 0. 0. 0. 1.9776824566023249e-01 0. 0. 0.  .2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
3.2869203526862529e+00 0. 0. 0. 1.1631692248472096e+00 0. 0. 0. 2.2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
2.9815870012055705e+00 0. 0. 0. 6.5049770685681069e+03 0. 0. 0. 6.8510191786605528e+03 
<_ type_id="opencv-matrix"> 3 3 d 
4.6608996548002040e+00 0. 0. 0. 3.7558131457318683e+02 0. 0. 0. 2.2204460492503131e-16 

請注意,缺少XML標頭。 現在為了讀取我正在使用的數據

cv::FileStorage fs("model.xml",cv::FileStorage::READ);

必須使用filenode作為參數調用cv :: Algorithm :: read()函數。 我不確定要使用哪個節點。 因為我希望文件中只有一個節點,所以我嘗試了

classifier.read(fs[0]);

但是此算法之后沒有經過訓練。 為了恢復原始參數,我需要做什么?

我只是用

        const FileStorage fs(filename, FileStorage::READ);
        EM model;
        if (fs.isOpened()) {
            const FileNode& fn = fs["StatModel.EM"];
            model.read(fn);
        } 

有用。

相反,可以使用'write'來執行以下操作:

fs<<"my_model"<<classifier;

然后,在打開FileStorage進行讀取之后,請像這樣讀取它:

cv::EM EModel;
fs["my_model"] >> EModel;

編輯:以上內容不適用於cv :: EM,因為它不包含在重載中。

鏈接提供了一個很好的示例,說明如何在XML / YAML文件中讀寫自定義類。 據此,您為類創建了“寫入”和“讀取”方法,因此您是定義和命名節點的人。

如果您還沒有自己編寫這些方法,並且它們是cv :: Algorithm的一部分(可能這是新的,我在我使用的2.2中找不到它),那么建議您檢查xml文件以查看創建的節點的名稱,然后使用>>運算符或執行以下操作獲取它們:

FileNode myFilenode = fs["node_name"];
classifier.read(myFilenode);

從您提供的StatModel.EM 1 <_ type_id="opencv-matrix">和鏈接中的xml示例中,我猜想該節點的名稱實際上是“ _”(如果不這樣做,則可能是默認值)在寫時提供任何名稱)

另一種語法是

    FileStorage fs(filename, FileStorage::READ);
    Mat mat;
    if (fs.isOpened()) {
        fs["mat_name"]>>mat;
    }
    fs.release();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM