博客專欄

        EEPW首頁 > 博客 > 獨家|OpenCV1.8 使用XML和YAML文件實現文件的輸入/輸出

        獨家|OpenCV1.8 使用XML和YAML文件實現文件的輸入/輸出

        發布人:數據派THU 時間:2021-08-20 來源:工程師 發布文章

        目標

        本小節將回答以下問題:

        如何使用YAML或XML文件打印和讀取文本輸入到文件和OpenCV?

        如何對OpenCV數據結構做相同的操作?

        如何為自定義的數據結構做相同的操作?

        OpenCV中cv::FileStorage , cv::FileNode 和 cv::FileNodeIterator 的數據結構和使用方法。

        源代碼

        C ++

        可以在原文下載源代碼,也可以在以下目錄中

        samples/cpp/tutorial_code/core/file_input_output/file_input_output.cpp 找到 OpenCV的源代碼庫。

        這里還有完整的示例代碼。

        1.png2.png3.png4.png

        代碼詳解

        在這里,只講解XML和YAML文件輸入。你的輸出(及其對應的輸入)只能是具有XML和YAML擴展名的文件,并帶有XML和YAML數據結構。這里有兩種可以串行化的數據結構:映射(諸如STL映射和Python字典)和元素序列(如STL向量)。二者之間的區別是,映射中的每一個元素均有唯一的名稱,可以通過該名稱進行訪問。對于序列而言,則需要通過遍歷來查詢一個具體的項目。

        1. 打開和關閉XML / YAML文件。在讀寫文件內容之前,首先需要打開文件,在使用結束時關閉文件。OpenCV中的XML / YAML數據結構是CV :: FileStorage。具體來說,該結構可以將文件與硬盤驅動器綁定起來,這樣便可以使用它的構造函數或open()函數:

        5.png

        無論是哪一種數據結構,它的第二個參數都是一個常數,可以用來指定操作類型,比如:寫入讀取或追加。文件的擴展名還決定了輸出文件的格式。如果輸出文件的擴展名為*.xml.gz*,甚至能夠輸出壓縮文件。

        當釋放CV :: FileStorage對象之后,該文件將自動關閉。可以通過調用release 函數顯式地自動關閉文件:

        6.png

        2. 文本和數字的輸入/輸出。C ++中,數據結構使用STL庫中的<<輸出操作符。Python中,則使用了 )。輸出任何類型的數據結構,首先需要指定其名稱,在C++中,只需要單純地將名稱推給數據流。在Python中,寫函數的第一個參數便是名稱。可以用以下命令打印文本和數字:

        7.png

        讀取是一種簡單的尋址方式(使用 []操作符)、casting操作或使用>>操作符讀出。在Python中,使用real()和getNode()函數來尋址:

        8.png

        3. OpenCV數據結構的輸入/輸出。該操作與基礎C ++和Python的類型完全相同。

        9.png

        4. 向量(數組)的輸入/輸出和相關映射。正如前文所述,輸出可以是映射和序列(數組,向量)。同樣,可以先打印變量的名稱,然后指定輸出的序列或映射。

        在序列的第一個元件之前打印“[”字符,在序列的最后一個元素之后打印 “]”字符。在Python語言中,調用 FileStorage.startWriteStruct(structure_name,struct_type) , 其中struct_type為 cv2.FileNode_MAP或cv2.FileNode_SEQ結構,最后調用FileStorage.endWriteStruct()來實現結構:

        10.png

        同理,對用映射,可以使用“{”和“}”分隔符來代替“[”和]”字符:

        11.png

        在讀操作中,可以使用的和cv::FileNodeIterator兩種數據結構。cv::FileStorage 類中的[]操作符(在Python中為 getNode()函數)可以返回一個數據類型。如果節點為序列結構,則可以使用CV :: FileNodeIterator進行迭代。在Python中,可以調用at()函數訪問序列中的元素,并用size() 函數返回序列長度:

        12.png

        對于映射,可以使用[]操作符(在Python中為at()函數)來訪問數據(也可使用>>操作符):

        13.png

        5. 讀/寫自定義的數據結構。假定有一個數據結構,如下所示:

        微信圖片_20210820192839.jpg

        在C ++中,通過OpenCV 的XML / YAML I / O接口實現串行化?(僅針對OpenCV的數據結構),為自定義的類添加讀取和寫入函數。在Python中,可以在類的內部一個讀取和寫入函數來完成類似的操作。內部情況如下:

        15.png

        在C ++中,需要在類的外部添加下列函數的定義:

        16.png

        如果用戶試圖讀取一個不存在的節點時,只返回默認初始值。而更為詳細的解決方案則是為對象ID返回一個為-1的值。

        一旦添加了該函數定義,則這四個函數便會使用>>操作符寫入和<<操作符讀取(或是Python中的輸入/輸出函數)

        17.png

        或者可以嘗試讀取一個不存在的節點:

        18.png

        程序運行結果

        在大多情況下,只需要將定義好的數值打印出來,在顯示屏幕上可以看到以下運行輸出結果:

        19.png

        更加有趣的是:還可以在輸出的XML文件中看到以下結果:

        20.png

        或者在輸出的YAML文件中看到以下結果:

        21.png

        可以在YouTube網站觀看這個示例的運行視頻。

        注:本文以C++語言代碼為例,獲取Java和python版本可在原文中查看:

        https://docs.opencv.org/4.5.2/dd/d74/tutorial_file_input_output_with_xml_yml.html

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宣汉县| 泸州市| 禹城市| 夹江县| 吴江市| 浪卡子县| 井陉县| 江油市| 新营市| 兰西县| 泰州市| 泌阳县| 苍南县| 九龙县| 福鼎市| 保康县| 泰州市| 富裕县| 栾城县| 岑巩县| 湘阴县| 四子王旗| 且末县| 武夷山市| 新河县| 永顺县| 偏关县| 布拖县| 依安县| 凌云县| 赤城县| 太和县| 瑞丽市| 卢龙县| 鹰潭市| 蒙阴县| 莒南县| 错那县| 长阳| 会泽县| SHOW|