在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > 獨(dú)家|OpenCV1.8 使用XML和YAML文件實現(xiàn)文件的輸入/輸出

            獨(dú)家|OpenCV1.8 使用XML和YAML文件實現(xiàn)文件的輸入/輸出

            發(fā)布人:數(shù)據(jù)派THU 時間:2021-08-20 來源:工程師 發(fā)布文章

            目標(biāo)

            本小節(jié)將回答以下問題:

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

            如何對OpenCV數(shù)據(jù)結(jié)構(gòu)做相同的操作?

            如何為自定義的數(shù)據(jù)結(jié)構(gòu)做相同的操作?

            OpenCV中cv::FileStorage , cv::FileNode 和 cv::FileNodeIterator 的數(shù)據(jù)結(jié)構(gòu)和使用方法。

            源代碼

            C ++

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

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

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

            1.png2.png3.png4.png

            代碼詳解

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

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

            5.png

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

            當(dāng)釋放CV :: FileStorage對象之后,該文件將自動關(guān)閉??梢酝ㄟ^調(diào)用release 函數(shù)顯式地自動關(guān)閉文件:

            6.png

            2. 文本和數(shù)字的輸入/輸出。C ++中,數(shù)據(jù)結(jié)構(gòu)使用STL庫中的<<輸出操作符。Python中,則使用了 )。輸出任何類型的數(shù)據(jù)結(jié)構(gòu),首先需要指定其名稱,在C++中,只需要單純地將名稱推給數(shù)據(jù)流。在Python中,寫函數(shù)的第一個參數(shù)便是名稱??梢杂靡韵旅畲蛴∥谋竞蛿?shù)字:

            7.png

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

            8.png

            3. OpenCV數(shù)據(jù)結(jié)構(gòu)的輸入/輸出。該操作與基礎(chǔ)C ++和Python的類型完全相同。

            9.png

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

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

            10.png

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

            11.png

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

            12.png

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

            13.png

            5. 讀/寫自定義的數(shù)據(jù)結(jié)構(gòu)。假定有一個數(shù)據(jù)結(jié)構(gòu),如下所示:

            微信圖片_20210820192839.jpg

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

            15.png

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

            16.png

            如果用戶試圖讀取一個不存在的節(jié)點(diǎn)時,只返回默認(rèn)初始值。而更為詳細(xì)的解決方案則是為對象ID返回一個為-1的值。

            一旦添加了該函數(shù)定義,則這四個函數(shù)便會使用>>操作符寫入和<<操作符讀?。ɑ蚴荘ython中的輸入/輸出函數(shù))

            17.png

            或者可以嘗試讀取一個不存在的節(jié)點(diǎn):

            18.png

            程序運(yùn)行結(jié)果

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

            19.png

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

            20.png

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

            21.png

            可以在YouTube網(wǎng)站觀看這個示例的運(yùn)行視頻。

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

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

            *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: AI

            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉