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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

OpenCV中XML文件和YAML文件的读写

發(fā)布時間:2025/7/25 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中XML文件和YAML文件的读写 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

OpenCV中XML文件和YAML文件的讀寫

代碼如下:

#include <opencv2/core/core.hpp> #include <iostream> #include <string>using namespace cv; using namespace std;static void help(char** av) {cout << endl<< av[0] << " shows the usage of the OpenCV serialization functionality." << endl<< "usage: " << endl<< av[0] << " outputfile.yml.gz" << endl<< "The output file may be either XML (xml) or YAML (yml/yaml). You can even compress it by "<< "specifying this in its extension like xml.gz yaml.gz etc... " << endl<< "With FileStorage you can serialize objects in OpenCV by using the << and >> operators" << endl<< "For example: - create a class and have it serialized" << endl<< " - use it to read and write matrices." << endl; }class MyData { public:MyData() : A(0), X(0), id(){}explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion{}void write(FileStorage& fs) const //Write serialization for this class{fs << "{" << "A" << A << "X" << X << "id" << id << "}";}void read(const FileNode& node) //Read serialization for this class{A = (int)node["A"];X = (double)node["X"];id = (string)node["id"];} public: // Data Membersint A;double X;string id; };//These write and read functions must be defined for the serialization in FileStorage to work static void write(FileStorage& fs, const std::string&, const MyData& x) {x.write(fs); } static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){if(node.empty())x = default_value;elsex.read(node); }// This function will print our custom class to the console static ostream& operator<<(ostream& out, const MyData& m) {out << "{ id = " << m.id << ", ";out << "X = " << m.X << ", ";out << "A = " << m.A << "}";return out; }int main(int ac, char** av) {if (ac != 2){help(av);return 1;}string filename = av[1];{ //writeMat R = Mat_<uchar>::eye(3, 3),T = Mat_<double>::zeros(3, 1);MyData m(1);FileStorage fs(filename, FileStorage::WRITE);fs << "iterationNr" << 100;fs << "strings" << "["; // text - string sequencefs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";fs << "]"; // close sequencefs << "Mapping"; // text - mappingfs << "{" << "One" << 1;fs << "Two" << 2 << "}";fs << "R" << R; // cv::Matfs << "T" << T;fs << "MyData" << m; // your own data structuresfs.release(); // explicit closecout << "Write Done." << endl;}{//readcout << endl << "Reading: " << endl;FileStorage fs;fs.open(filename, FileStorage::READ);int itNr;//fs["iterationNr"] >> itNr;itNr = (int) fs["iterationNr"];cout << itNr;if (!fs.isOpened()){cerr << "Failed to open " << filename << endl;help(av);return 1;}FileNode n = fs["strings"]; // Read string sequence - Get nodeif (n.type() != FileNode::SEQ){cerr << "strings is not a sequence! FAIL" << endl;return 1;}FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the nodefor (; it != it_end; ++it)cout << (string)*it << endl;n = fs["Mapping"]; // Read mappings from a sequencecout << "Two " << (int)(n["Two"]) << "; ";cout << "One " << (int)(n["One"]) << endl << endl;MyData m;Mat R, T;fs["R"] >> R; // Read cv::Matfs["T"] >> T;fs["MyData"] >> m; // Read your own structure_cout << endl<< "R = " << R << endl;cout << "T = " << T << endl << endl;cout << "MyData = " << endl << m << endl << endl;//Show default behavior for non existing nodescout << "Attempt to read NonExisting (should initialize the data structure with its default).";fs["NonExisting"] >> m;cout << endl << "NonExisting = " << endl << m << endl;}cout << endl<< "Tip: Open up " << filename << " with a text editor to see the serialized data." << endl;return 0; }

Explanation

這里只討論XML 和 YAML 文件的讀取,這是兩種不同的可能會序列化的數(shù)據(jù)結構: mappings (類似STL的map) 和 element sequence (類似STL的vector). 兩種結構的區(qū)別為 map 的每一個元素都有一個具有唯一性的名字,通過具有唯一性的名字(鍵)可以訪問對應的元素值.對于序列,你需要通過他們來查詢一個特定的項目.

1 XML/YAML 文件的代開和關閉

OpenCV中XML/YAML數(shù)據(jù)結構類型為cv::FileStorage,要打開硬盤上的文件,可以基于構造函數(shù)或者open()函數(shù)

string filename = "I.xml"; FileStorage fs(filename, FileStorage::WRITE); //... fs.open(filename, FileStorage::READ);
函數(shù)中的第二個參數(shù)為: WRITE, READ 或 APPEND,表示不同的操作類型(寫,讀或追加)。文件的擴展名表明輸出文件的格式,當時用擴展名*.xml.gz*.時文件會被壓縮。

當cv::FileStorage對象銷毀時,文件會被自動關閉,可以通過顯式調(diào)用關閉文件。

fs.release(); // explicit close

2 文本和數(shù)字的輸入輸出 數(shù)據(jù)結構采用和STL標準庫一樣的輸出操作符<< ,輸出任何類型的數(shù)據(jù)結構首先需要指定文件名.

fs << "iterationNr" << 100;讀入是一個簡單的通過 [] 操作符實現(xiàn)的地址和映射操作 或者 通過 >> 操作符讀 :

int itNr; fs["iterationNr"] >> itNr; itNr = (int) fs["iterationNr"]; 3  OpenCV 數(shù)據(jù)結構的讀入和輸出.? C++風格的方法:


Mat R = Mat_<uchar >::eye (3, 3),T = Mat_<double>::zeros(3, 1); fs << "R" << R; // Write cv::Mat fs << "T" << T; fs["R"] >> R; // Read cv::Mat fs["T"] >> T;

4 vectors (arrays) 和 associative maps的輸入輸出

向前面說的,我們可以輸出maps 和 sequences (array, vector) 。首先我們輸出變量的名字,然后指定類型為 sequence 或者 map.

對于 sequence在第一個元素前輸出 "[" 字符 并且在最后一個元素后輸出 "]" 字符:

fs << "strings" << "["; // text - string sequence fs << "image1.jpg" << "Awesomeness" << "baboon.jpg"; fs << "]"; // close sequence
對于 maps the drill是同樣的,但是使用 "{" 和 "}" 分割字符:
fs << "Mapping"; // text - mapping fs << "{" << "One" << 1; fs << "Two" << 2 << "}";

讀取操作使用 cv::FileNode 和? cv::FileNodeIterator 數(shù)據(jù)結構.??? cv::FileStorage 的操作符[]返回的是 cv::FileNode 數(shù)據(jù)類型. If the node is sequential we can use the cv::FileNodeIterator to iterate through the items:

FileNode n = fs["strings"]; // Read string sequence - Get node if (n.type() != FileNode::SEQ) {cerr << "strings is not a sequence! FAIL" << endl;return 1; } FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node for (; it != it_end; ++it)cout << (string)*it << endl;
對于 maps 使用[] 操作符訪問給定的條目(或者 >> 操作符):

n = fs["Mapping"]; // Read mappings from a sequence cout << "Two " << (int)(n["Two"]) << "; "; cout << "One " << (int)(n["One"]) << endl << endl; 5  讀寫自己的數(shù)據(jù)結構  假設有如下結構:

class MyData { public:MyData() : A(0), X(0), id() {} public: // Data Membersint A;double X;string id; };
通過 在自定義類的內(nèi)部和外部添加讀寫函數(shù),借助OpenCV I/O XML/YAML 接口序列化是可能的 (就像 OpenCV的數(shù)據(jù)結構一樣 ) 。

類內(nèi)部的部分:

void write(FileStorage& fs) const //Write serialization for this class {fs << "{" << "A" << A << "X" << X << "id" << id << "}"; } void read(const FileNode& node) //Read serialization for this class {A = (int)node["A"];X = (double)node["X"];id = (string)node["id"]; } 類外部的部分:


void write(FileStorage& fs, const std::string&, const MyData& x) {x.write(fs); }void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()) {if(node.empty())x = default_value;elsex.read(node); }

接下來將會定義讀取不存在的節(jié)點將會發(fā)生的情況. 這種情況下返回默認的初始化值, 然而,一個更詳細的解決辦法是對于實例返回一個負值作為object ID.

一旦添加了使用 >>作為寫操作符,使用 <<為讀操作符的4個函數(shù):

MyData m(1); fs << "MyData" << m; // your own data structures fs["MyData"] >> m; 或者執(zhí)行一個不存在讀:
fs["NonExisting"] >> m; // Do not add a fs << "NonExisting" << m command for this to work cout << endl << "NonExisting = " << endl << m << endl;
結果

只打印出定義的數(shù)字。在控制臺屏幕上看到:

Write Done. Reading: 100image1.jpg Awesomeness baboon.jpg Two 2; One 1 R = [1, 0, 0;0, 1, 0;0, 0, 1] T = [0; 0; 0] MyData = { id = mydata1234, X = 3.14159, A = 97} Attempt to read NonExisting (should initialize the data structure with its default). NonExisting = { id = , X = 0, A = 0} Tip: Open up output.xml with a text editor to see the serialized data.

輸出的XML文件

<?xml version="1.0"?> <opencv_storage> <iterationNr>100</iterationNr> <strings>image1.jpg Awesomeness baboon.jpg</strings> <Mapping><One>1</One><Two>2</Two></Mapping> <R type_id="opencv-matrix"><rows>3</rows><cols>3</cols><dt>u</dt><data>1 0 0 0 1 0 0 0 1</data></R> <T type_id="opencv-matrix"><rows>3</rows><cols>1</cols><dt>d</dt><data>0. 0. 0.</data></T> <MyData><A>97</A><X>3.1415926535897931e+000</X><id>mydata1234</id></MyData> </opencv_storage>

輸出的 YAML 文件:


%YAML:1.0 iterationNr: 100 strings:- "image1.jpg"- Awesomeness- "baboon.jpg" Mapping:One: 1Two: 2 R: !!opencv-matrixrows: 3cols: 3dt: udata: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ] T: !!opencv-matrixrows: 3cols: 1dt: ddata: [ 0., 0., 0. ] MyData:A: 97X: 3.1415926535897931e+000id: mydata1234


總結

以上是生活随笔為你收集整理的OpenCV中XML文件和YAML文件的读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。