[英]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.