日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV读写xml和yml文件

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV读写xml和yml文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????有時候我們處理完圖像后需要保存一下數據到文件上,以供下一步的處理。一個比較廣泛的需求場景就是:我們對一幅圖像進行特征提取之后,需要把特征點信息保存到文件上,以供后面的機器學習分類操作。那么如果遇到這樣的場景,我們有什么好方法,搭建這類的小型數據庫文件?我第一時間想到的是把這些數據全寫到文件上,下次我們需要這些數據就把他們從文件里讀出來就好了。

?????其實更好的辦法是使用xml和yml,因為他們更具有可讀性,簡直就是為保存數據結構而生的好方法!OpenCV提供了很好用的讀寫xml/yml的類,我們只要掌握其讀寫要領,很容易就可以實現這個小型數據庫。

?????OpenCV 中的 FileStorage 類能夠讀寫硬盤中的.xml和.yaml文件,讀寫操作:

?????寫入(FileStorage::WRITE,覆蓋寫,注意:文檔已存在且有內容時會覆蓋已有內容,有時會破壞文件格式,建議文檔已存在時進行刪除文檔操作再執行寫入)

?????追加(FileStorage::APPEND,追加寫)

?????讀取(FileStorage::READ))

xml/yml的寫操作

如何將我們的數據寫入文件保存下來?

一個簡單數據寫入的例子

下面是我們最常用的一些數據類型的寫入xml的操作。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;typedef struct
{int x;int y;string s;
}test_t;int main(int argc, char** argv)
{FileStorage fs("test.xml", FileStorage::WRITE); //填入寫操作//測試數據int a1 = 2;char a2 = -1;string str = "hello sysu!";int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };test_t t = { 3,4,"hi sysu" };map<string, int> m;m["kobe"] = 100;m["james"] = 99;m["curry"] = 98;//寫入文件操作,先寫標注在寫數據fs << "int_data" << a1;fs << "char_data" << a2;fs << "string_data" << str;//寫入數組fs <<"array_data"<< "["; //數組開始for (int i = 0; i < 10; i++){fs << arr[i];}fs << "]"; //數組結束//寫入結構體fs << "struct_data" << "{"; //結構體開始fs << "x" << t.x;fs << "y" << t.y;fs << "s" << t.s;fs << "}";  //結構結束//map的寫入 fs << "map_data" << "{";  //map的開始寫入map<string, int>::iterator it = m.begin();for (; it != m.end(); it++){fs << it->first << it->second;}fs << "}";  //map寫入結束return 0;
}

打開test.xml文件,我們看到我們的數據保存是這樣子的:

如果我們將文件存為test.yml,即

FileStorage fs("test.yml", FileStorage::WRITE);

那么我們最終的得到的test.yml是這樣子的:

我們還可以保存為txt格式

FileStorage fs("test.txt", FileStorage::WRITE);

打開看是這樣的:

我們還還可以保存為doc文件!

FileStorage fs("test.doc", FileStorage::WRITE); 

打開看是這樣子的:

我們可以看出,顯然yml文件的排版更加簡潔明了,xml文件卻顯得有點冗余和雜亂了。

一個復雜寫入的例子

在這里舉一個簡易的學生信息系統文件的搭建,以熟悉一下較為復雜的數據結構的寫入文件的操作流程。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;typedef struct
{string phone_num;string address;
}contact_t;typedef struct
{string name;int age;
}parents_t;typedef struct
{string name;int age;int id;contact_t contact_ways;parents_t parents[2];
}student_t;int main(int argc, char** argv)
{FileStorage fs("student.xml", FileStorage::WRITE); //填入寫操作student_t st[3]; memset(st, 0, sizeof(st));//測試數據填入st[0].name = "Kobe";st[0].age = 21;st[0].id = 1;st[0].contact_ways.address = "1st building";st[0].contact_ways.phone_num = "123";st[0].parents[0].name = "dad";st[0].parents[1].name = "mum";st[0].parents[0].age = 40;st[0].parents[1].age = 39;st[1].name = "James";st[1].age = 20;st[1].id = 2;st[1].contact_ways.address = "2st building";st[1].contact_ways.phone_num = "12223";st[1].parents[0].name = "daddy";st[1].parents[1].name = "mumy";st[1].parents[0].age = 44;st[1].parents[1].age = 38;fs << "student" << "["; //結構體數組的開始for (int i = 0; i < 3; i++){fs <<"{"; //結構體的開始fs << "name" << st[i].name;fs << "age" << st[i].age;fs << "id" << st[i].id;fs << "contact_ways" << "{";  //嵌套結構體的開始fs << "phone_number" << st[i].contact_ways.phone_num;fs << "address" << st[i].contact_ways.address;fs << "}";  //結構體結束fs << "parents"<<"[";  //嵌套結構體數組開始for (int j = 0; j < 2; j++){fs << "{";fs << "name" << st[i].parents[j].name;fs << "age" << st[i].parents[j].age;fs << "}";}fs << "]";  //嵌套結構體數組結束fs << "}"; //結構體結束}fs << "]"; // 結構體數組結束return 0;
}

打開student.xml文件,如下

<?xml version="1.0"?>
<opencv_storage>
<student><_><name>Kobe</name><age>21</age><id>1</id><contact_ways><phone_number>"123"</phone_number><address>"1st building"</address></contact_ways><parents><_><name>dad</name><age>40</age></_><_><name>mum</name><age>39</age></_></parents></_><_><name>James</name><age>20</age><id>2</id><contact_ways><phone_number>"12223"</phone_number><address>"2st building"</address></contact_ways><parents><_><name>daddy</name><age>44</age></_><_><name>mumy</name><age>38</age></_></parents></_><_><name>""</name><age>0</age><id>0</id><contact_ways><phone_number>""</phone_number><address>""</address></contact_ways><parents><_><name>""</name><age>0</age></_><_><name>""</name><age>0</age></_></parents></_></student>
</opencv_storage>

若存儲的是yml文件,打開如下:

%YAML:1.0
student:-name: Kobeage: 21id: 1contact_ways:phone_number: "123"address: "1st building"parents:-name: dadage: 40-name: mumage: 39-name: Jamesage: 20id: 2contact_ways:phone_number: "12223"address: "2st building"parents:-name: daddyage: 44-name: mumyage: 38-name: ""age: 0id: 0contact_ways:phone_number: ""address: ""parents:-name: ""age: 0-name: ""age: 0

xml/yml的讀操作

?????我們的數據已經穩妥地寫入文件保存下來了,接下來我們想從該文件中讀取出我們的數據,該如何操作呢?我們繼續以上述的例子數據為例,講解讀操作。

一個簡單讀入的例子

我們舉個簡單例子,讀入上面提到test.xml的數據。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;typedef struct
{int x;int y;string s;
}test_t;int a1;
int a2;
string str;
int arr[10];
test_t t;
map<string, int> m;//打印出學生資料,來驗證讀取文件信息是否成功
void data_info_dump()
{cout << "a1:" << a1 << endl;cout << "a2:" << a2 << endl;cout << "str:" << str << endl;cout << "t.x:" << t.x << endl;cout << "t.y:" << t.y << endl;cout << "t.s:" << t.s << endl;cout << "curry:" << m["curry"] << endl;cout << "kobe:" << m["kobe"] << endl;cout << "james:" << m["james"] << endl;for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}int main(int argc, char** argv)
{FileStorage fs("test.xml", FileStorage::READ); //填入讀操作a1 = (int)fs["int_data"];a2 = (int)fs["char_data"];str = (string)fs["string_data"];//讀入數組FileNode arr_node = fs["array_data"];FileNodeIterator fni = arr_node.begin(); FileNodeIterator fniEnd = arr_node.end();int count = 0;for (; fni != fniEnd; fni++){arr[count++] = (int)(*fni);}//讀入mapFileNode map_node = fs["map_data"];m["curry"] = (int)map_node["curry"];m["james"] = (int)map_node["james"];m["kobe"] = (int)map_node["kobe"];//讀入結構體FileNode struct_node = fs["struct_data"];t.x = (int)struct_node["x"];t.y = (int)struct_node["y"];t.s = (string)struct_node["s"];data_info_dump();return 0;
}

打印如下:

一個復雜讀入的例子

我們以讀取上面所提到的student.xml為例,說明如何讀取一個xml文件數據到內存。

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;typedef struct
{string phone_num;string address;
}contact_t;typedef struct
{string name;int age;
}parents_t;typedef struct
{string name;int age;int id;contact_t contact_ways;parents_t parents[2];
}student_t;student_t st[3];//打印出學生資料,來驗證讀取文件信息是否成功
void stu_info_dump()
{for (int i = 0; i < 3; i++){printf("第%d個學生\n",i+1);cout << "name:" << st[i].name << endl;cout << "id:" << st[i].id << endl;cout << "age:" << st[i].age << endl;cout << "contact address:" << st[i].contact_ways.address << endl;cout << "contact number:" << st[i].contact_ways.phone_num << endl;cout << "father name:" << st[i].parents[0].name << endl;cout << "father age:" << st[i].parents[0].age << endl;cout << "mother name:" << st[i].parents[1].name << endl;cout << "mother age:" << st[i].parents[1].age << endl;printf("\n\n");}
}int main(int argc, char** argv)
{FileStorage fs("student.xml", FileStorage::READ); //填入讀操作memset(st, 0, sizeof(st));FileNode student_node = fs["student"];//讀取根節點FileNodeIterator fni = student_node.begin(); //獲取結構體數組迭代器FileNodeIterator fniEnd = student_node.end();int count = 0;for (; fni != fniEnd; fni++)//遍歷  {st[count].name = (string)(*fni)["name"];st[count].id = (int)(*fni)["id"];st[count].age = (int)(*fni)["age"];//contact結構體內容FileNode contact = (*fni)["contact_ways"];st[count].contact_ways.address = (string)contact["address"];st[count].contact_ways.phone_num = (string)contact["phone_number"];//parents結構體數組內容FileNode parents = (*fni)["parents"];FileNodeIterator fni2 = parents.begin(); //獲取結構體數組迭代器FileNodeIterator fniEnd2 = parents.end();int count2 = 0;for (; fni2 != fniEnd2; fni2++)//遍歷  {st[count].parents[count2].name = (string)(*fni2)["name"];st[count].parents[count2].age = (int)(*fni2)["age"];count2++;}count++;}stu_info_dump();return 0;
}

打印如下,這表明xml的數據已經成功讀入內存了。

文章寫得很好,遂轉載記錄一下,轉載過程中難免出錯,如有問題請在評論區指出,下面附上原文鏈接~
轉自

總結

以上是生活随笔為你收集整理的OpenCV读写xml和yml文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本xxxx高清 | 在线免费观看成年人视频 | 国产精品自拍偷拍视频 | 视频一区在线观看 | 色婷婷欧美 | 日日骚网 | 综合色吧| 欧美国产精品久久 | 欧美一区二区三区黄色 | 一区二区三区视频免费看 | 99视频在线观看免费 | 成人激情视频在线观看 | 性欧美久久 | 国产日韩一区二区三免费高清 | 亚洲午夜精品福利 | 岛国免费av| 露胸app| 国产精品成| 成人激情四射网 | 欧美做爰xxxⅹ性欧美大片 | 牛牛精品一区二区 | 久久成人精品一区二区 | 9999国产精品| 欧美精品在线观看视频 | 瑟瑟视频在线观看 | 涩色网 | 成人中文网 | 五月天色网站 | 国产欧美在线一区 | jizz高潮 | 中文免费在线观看 | 天堂中文在线免费观看 | 一女双乳被两男吸视频 | 一级激情片 | 人人入人人 | 日日摸夜夜添狠狠添久久精品成人 | 91精品国产成人 | a∨色狠狠一区二区三区 | 免费在线观看av网址 | 国产精品久久久亚洲 | 日韩有色 | 欧美理伦片在线播放 | 中文字幕在线视频网站 | 久久精品2 | 日韩精品视频免费播放 | 91资源站 | cao久久| 简单av网| 国产高清精品一区二区三区 | 动漫羞羞| 婷婷精品一区二区三区 | 一本色道久久综合狠狠躁的推荐 | 中文字幕乱码一二三区 | 操干网 | 高清免费毛片 | 亚洲国产精品久 | 日本www高清 | 国产区亚洲区 | 亚洲无码精品国产 | 欧美 日韩 国产在线 | 97国产免费| 欧美一级片在线观看 | 五十路av在线 | jizz色| www.色播.com | 日本成人免费视频 | 国产免费av网址 | 老熟妇一区二区三区啪啪 | 亚洲激情视频在线观看 | 成人精品免费视频 | 女人脱了内裤趴开腿让男躁 | 国产精品久久久久久久毛片 | 性欧美又大又长又硬 | 日本少妇aaa | 波多野结衣视频免费在线观看 | 久久综合热 | 国产又黄视频 | 夜夜超碰| 毛片网站大全 | 天天做夜夜爱 | 日韩在线观看一区二区 | 污视频在线观看网址 | 欧美三级午夜理伦三级小说 | 国产一二三区免费视频 | 少妇一级视频 | 精品视频在线免费观看 | 久久久精品亚洲 | 波多野结衣高清电影 | 日本免费视频 | 污污污污污污www网站免费 | av网址在线看 | 四虎新网址 | 操极品少妇 | 一级片免费的 | 国产午夜麻豆影院在线观看 | 91黄色在线视频 | 国产日韩欧美日韩大片 | 中文字幕亚洲区 | 狠狠艹av|