OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
為OpenCV編寫文件

上一教程: 影像入門
下一教程: 過渡指南

原始作者馬克西姆·沙布寧
相容性OpenCV >= 3.0

Doxygen 概述

簡介

Doxygen 是一個文件生成系統,具有許多強大的功能,例如

  • 解析程式原始碼以生成真實準確的文件
  • 檢查文件中的錯誤
  • 插入圖片和公式
  • 使用 Markdown 語法和純 HTML 進行精確文字格式化
  • 生成多種不同格式的文件

OpenCV 庫的現有文件已轉換為 Doxygen 格式。

安裝

請查閱官方下載安裝頁面。一些 Linux 發行版也可能提供 Doxygen 軟體包。

生成文件

  • 獲取 OpenCV 原始碼(3.0 及更高版本)
  • 可選: 獲取 OpenCV_contrib 原始碼
  • 在原始碼資料夾旁邊建立構建目錄並進入該目錄
  • 執行 cmake(假設您將原始碼放在 opencv 資料夾中)
    cmake -DBUILD_DOCS=ON ../opencv
    或者如果您也獲取了 contrib 原始碼
    cmake -DBUILD_DOCS=ON -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
  • 執行 make
    make doxygen
  • 在您喜歡的瀏覽器中開啟 doc/doxygen/html/index.html 檔案
  • 測試您的 Python 程式碼
    make check_pylint
    注意
    在執行 cmake 之前必須安裝 Pylint 才能測試 Python 程式碼。您可以使用系統的包管理器或 pip 進行安裝
    pip install pylint

快速入門

注意
這些說明專用於 OpenCV 庫文件,其他專案可能使用不同的佈局方案和文件約定。

文件位置

整個文件從許多不同的地方收集:

  • 原始碼實體,如類、函式或列舉,應在其定義之前的相應標頭檔案中進行文件編寫。請參見下一節中的示例。
  • 頁面是放置大量文字、圖片和程式碼示例的好地方,這些內容不直接與任何原始碼實體相關聯。頁面應位於單獨的檔案中,幷包含在幾個預定義的位置。本教程就是這種頁面的一個示例。
  • 圖片可用於說明所描述的事物。圖片通常與頁面位於相同的位置,可以插入到文件的任何地方。
  • 程式碼示例展示瞭如何在實際應用程式中使用該庫。每個示例都是一個自包含檔案,代表一個簡單的應用程式。這些檔案的一部分可以包含到文件和教程中,以演示函式呼叫和物件協作。
  • BibTeX 引用用於建立一個共同的參考文獻列表。所有作為庫功能基礎的科學書籍、文章和會議論文都應放入此參考文獻列表中。

以下方案表示 opencv 倉庫的常見文件位置:

<opencv>
├── doc - doxygen 配置檔案、根頁面 (root.markdown.in)、BibTeX 檔案 (opencv.bib)
│   ├── tutorials - 教程層次結構(頁面和圖片)
│   └── py_tutorials - Python 教程層次結構(頁面和圖片)
├── modules
│  > └── <模組名>
│      ├── doc - 模組的文件頁面和圖片
│      └── include - 標頭檔案中的程式碼文件
└── samples - 所有程式碼示例的存放位置
├── cpp
│ └── tutorial_code - 教程程式碼示例的存放位置
└── ...
注意
自動程式碼解析器會在 include 資料夾及其子資料夾中查詢所有標頭檔案(".h, .hpp",但排除 ".inl.hpp; .impl.hpp; _detail.hpp")。一些模組特定的指令(組定義)和文件應放入 "include/opencv2/<module-name>.hpp" 檔案中。
您可以將 C++ 模板實現和特化放入 Doxygen 忽略的單獨檔案(".impl.hpp")中。
src 子資料夾中的檔案未被解析,因為文件主要面向庫使用者而非開發人員。但仍可以透過在 cmake 指令碼(doc/CMakeLists.txt)中自定義處理檔案列表以及在 Doxygen 配置檔案(doc/Doxyfile.in)中設定選項來生成完整的文件。

自 3.0 版本起,所有新模組都放置在 opencv_contrib 倉庫中,其佈局略有不同:

<opencv_contrib>
└── modules
└── <模組名>
├── doc - 文件頁面和圖片,BibTeX 檔案 (<模組名>.bib)
├── include - 標頭檔案中的程式碼文件
├── samples - 文件和教程的程式碼示例存放位置
└── tutorials - 教程頁面和圖片

示例

要為函式、類和其他實體新增文件,只需在其定義之前插入特殊註釋,如下所示:

/** @brief Calculates the exponent of every array element.

The function exp calculates the exponent of every element of the input array:
\f[ \texttt{dst} [I] = e^{ src(I) } \f]

The maximum relative error is about 7e-6 for single-precision input and less than 1e-10 for
double-precision input. Currently, the function converts denormalized values to zeros on output.
Special values (NaN, Inf) are not handled.

@param src input array.
@param dst output array of the same size and type as src.

@sa log , cartToPolar , polarToCart , phase , pow , sqrt , magnitude
*/
CV_EXPORTS_W void exp(InputArray src, OutputArray dst);

您可以看到:

  • 特殊的 C 註釋語法表示這是一個 Doxygen 註釋
    /** ... */ 
  • 命令 brief 表示接下來的段落是簡要描述
    @brief 
  • 空行表示段落結束
  • f[f] 命令之間的 TeX 公式
    \f[ ... \f] 
  • 命令 param 表示接下來的詞是引數名稱,其後的文字是引數描述;所有引數都放在一個列表中
    @param 
  • 命令 sa 開始一個“另請參見”段落,其中包含對某些類、方法、頁面或 URL 的引用。
    @sa 

生成的引用項如下所示:

“更多...”連結將您帶到函式文件:

另一個示例

可以使用不同的註釋語法來表示單行短註釋:

//! type of line
enum LineTypes {
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};

在這裡

  • 特殊的 C++ 註釋語法表示這是一個 Doxygen 註釋
    //! 
  • 附加符號 < 表示此註釋位於被文件化實體之後
    //!< 

生成的文件塊如下所示:

更多細節

命令字首

Doxygen 命令以 @\ 符號開頭

@brief ...
or
\brief ...

註釋語法

Doxygen 註釋可以有不同的形式

C-style:
/** ... */
or
/*! ... */

C++-style
//! ...
or
/// ...

Lines can start with '*':
/**
 * ...
 * ...
 */

Can be placed after documented entity:
//!< ...
/**< ... */

段落結束

要結束段落,請插入空行或任何開始新段落的命令

@brief brief description paragraph
brief continues

new paragraph

@note new note paragraph
note paragraph continues

another paragraph
paragraph continues

命名

頁面、錨點、組和其他命名實體在整個專案中應具有唯一的名稱。最好以模組名稱作為這些識別符號的字首。

@page core_explanation_1 Usage explanation
@defgroup imgproc_transform Image transformations
@anchor mymodule_interesting_note

支援的 Markdown

Doxygen 支援帶有一些擴充套件的 Markdown 格式。下面描述了簡短的語法參考,詳情請訪問 Markdown 支援

列表

Bulleted:
- item1
- item2
Numbered:
1. item1
2. item2
or
-# item1
-# item2

強調

_italic_
__bold__
use html in complex cases:
<em>"path/to/file"</em>

連結

explicit link:
[OpenCV main site](https://opencv.tw)
automatic links:
<https://opencv.tw>
or even:
https://opencv.tw

圖片

![image caption](image path)

標題

Level1
======
Level2
------
### Level3
#### Level4

標題 ID

您可以為任何標題分配一個唯一識別符號,以便從其他地方引用它。

Header {#some_unique_identifier}
------
...
See @ref some_unique_identifier for details

頁面 ID

每個頁面開頭都應有一個額外的 Level1 標題,包含頁面標題和識別符號

Writing documentation for OpenCV {#tutorial_documentation}
================================

表格

Doxygen 文件中的示例

First Header  | Second Header
------------- | -------------
Content Cell  | Content Cell
Content Cell  | Content Cell

常用命令

這裡描述了最常用的 Doxygen 命令,並附有簡短示例。有關可用命令的完整列表和詳細描述,請訪問 命令參考

基本命令

  • brief - 包含實體簡要描述的段落
  • param - 函式引數的描述。

    多個相鄰語句合併為一個列表。如果在實際函式簽名中未找到具有此名稱的引數,Doxygen 將生成警告。函式可以 沒有 文件化的引數,也可以 所有 引數都應被文件化。

  • sa - “另請參見”段落,包含對類、函式、頁面或 URL 的引用
  • note - 視覺上突出顯示的“注意”段落。多個相鄰語句合併為一個塊。
  • return, returns - 描述函式的返回值
  • overload - 為函式描述新增固定文字:“這是一個過載成員函式,為方便起見提供。它與上述函式的區別僅在於它接受的引數。”
  • anchor - 放置一個不可見的命名錨點,可透過 ref 命令引用。它只能在頁面中使用。
  • ref - 對命名部分、頁面或錨點的顯式引用。

    如果找不到此類實體,Doxygen 將生成警告。此命令有一個可選引數 - 連結文字。

    Doxygen 還會自動生成一些連結:如果文字包含在已文件化實體中可以找到的詞,則會生成引用。可以透過在詞前新增 % 符號來停用此功能。

    Explicit reference: @ref MyClass
    Explicit named reference: @ref example_page "Example page"
    Implicit reference: cv::abc::MyClass1 or just MyClass1
    Disable implicit reference: %MyClass1
  • f - 公式

    內聯公式由 f$ 命令限定

    \f$ ... \f$

    塊級公式由 f[f] 命令限定

    \f[ ... \f]

程式碼包含命令

要在文件中將某些文字標記為程式碼,使用 codeendcode 命令。

@code
float val = img.at<float>(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
                          borderInterpolate(-5, img.cols, cv::BORDER_WRAP));
@endcode

語法將根據當前解析的檔案型別(.hpp 為 C++,.h 為 C)進行高亮顯示,或者您可以在大括號中手動指定它

@code{.xml}

要將整個示例檔案包含到文件中,使用 includeincludelineno 命令。檔案會在常見的示例位置中搜索,因此您只需指定其名稱或路徑的簡短部分。includelineno 版本還會顯示行號,但由於包含行號,因此會阻止複製貼上。

@include samples/cpp/test.cpp

如果要包含現有示例檔案的某些部分,請使用 snippet 命令。

首先,使用特殊的 Doxygen 註釋標記檔案中的所需部分

//! [var_init]
int a = 0;
//! [var_init]

然後將此片段包含到文件中

@snippet samples/cpp/test.cpp var_init
注意
目前,大多數此類部分包含都使用 dontinclude 命令,以與舊的 rST 文件相容。但新建立的示例應使用 snippet 命令包含,因為此方法受處理檔案更改的影響較小。

切換按鈕包含命令

切換按鈕用於顯示選定的配置(例如,程式語言、作業系統、IDE)。

要在文件中使用這些按鈕,需要使用 add_toggleend_toggle 命令。

add_toggle 命令可以是:

  • 通用:add_toggle{Button Name}
  • 針對 C++:add_toggle_cpp
  • 針對 Java:add_toggle_java
  • 針對 Python:add_toggle_python

示例

@add_toggle{Button Name}

  text / code / doxygen commands

@end_toggle

例如,將切換按鈕與文字和程式碼片段一起使用

### Buttons Example

@add_toggle_cpp

   Text for C++ button
   @snippet samples/cpp/tutorial_code/introduction/documentation/documentation.cpp hello_world

@end_toggle

@add_toggle_java

   Text for Java button
   @snippet samples/java/tutorial_code/introduction/documentation/Documentation.java  hello_world

@end_toggle

@add_toggle_python

   Text for Python button
   @snippet samples/python/tutorial_code/introduction/documentation/documentation.py hello_world

@end_toggle

結果如下所示:

按鈕示例

如您所見,按鈕會自動新增到上一個標題下方。

分組命令

所有程式碼實體都應放入代表 OpenCV 模組及其內部結構的命名組中,因此每個模組都應與一個同名組相關聯。定義組和子組的好地方是該模組的主標頭檔案:"<module>/include/opencv2/<module>.hpp"

注意
Doxygen 組被稱為“模組”,並顯示在“模組”頁面上。
/**
@defgroup mymodule My great module
    optional description
@{
    @defgroup mymodule_basic Basic operations
        optional description
    @defgroup mymodule_experimental Experimental operations
        optional description
@}
*/

要將類和函式放入特定組中,只需在其文件中新增 ingroup 命令,或者用 addtogroup 命令包裝整個程式碼塊。

/** @brief Example function
    @ingroup mymodule
*/
or
/**
@addtogroup mymodule_experimental
@{
*/
... several functions, classes or enumerations here
/**
@}
*/

參考文獻

使用 cite 命令插入對參考文獻頁面中列出的相關出版物的引用。

首先,將出版物 BibTeX 記錄新增到 "<opencv>/doc/opencv.bib""<opencv_contrib>/modules/<module>/doc/<module>.bib" 檔案中。

@ARTICLE{Bradski98,
    author = {Bradski, Gary R},
    title = {Computer vision face tracking for use in a perceptual user interface},
    year = {1998},
    publisher = {Citeseer}
}
注意
儘量不要新增重複的出版物,因為它可能會在以後混淆文件讀者和作者。

然後使用 cite 命令進行引用

@cite Bradski98
注意
要獲取出版物的 BibTeX 記錄,可以使用 Google 學術搜尋。找到出版物後,點選其“引用”連結,然後選擇“BibTeX”選項:

循序漸進

本節中描述的步驟可在編寫文件時用作檢查清單。並非所有步驟都必須按相同順序進行,但有些步驟確實依賴於之前的步驟。當然,這些步驟只是基本指南,總有發揮創造力的空間。

文件化函式

  1. 在函式定義之前新增空的 Doxygen 註釋。
  2. 在開頭新增 brief 命令,並簡要描述函式含義。
  3. 新增函式的詳細描述。
  4. 可選: 插入公式、圖片和示例程式碼塊以說明覆雜情況
  5. 可選: 使用 param 命令描述每個引數。
  6. 可選: 使用 returns 命令描述函式的返回值。
  7. 可選: 新增“另請參見”部分,其中包含指向類似函式或類的連結
  8. 可選: 新增參考文獻(如果有)。
  9. 測試您的程式碼。(Python:“make check_pylint”)
  10. 生成 Doxygen 文件並驗證結果。

編寫教程

  1. 構思教程中要說明的想法。
  2. 編寫示例應用程式,應足夠簡單以便初級開發人員理解。言簡意賅,編寫描述性註釋,不要試圖避免所有可能的執行時錯誤或製作通用工具。您的目標是闡明想法。而且它應該適合一個原始檔!

    如果您想將此檔案中的程式碼塊插入到教程中,請使用特殊的 Doxygen 註釋標記它們(參見此處)。

    如果您想用多種程式語言編寫教程,請使用切換按鈕來實現替代註釋和程式碼(參見此處)。

  3. 收集應用程式執行結果。可以是“前後”對比圖片、表示效能的數字,甚至是影片。

    以適當的格式儲存,以便稍後在教程中使用:

    • 對於簡單的圖表類圖片,請使用無損“.png”格式。
    • 對於照片類圖片,請使用有損“.jpg”格式。
    • 數字將以純文字形式插入,可能格式化為表格。
    • 影片應上傳到 YouTube。
  4. 在相應位置建立新的教程頁面(".markdown" 檔案)(參見此處),並將所有影像檔案放在其附近(或在“images”子目錄中)。同時放置您的示例應用程式檔案,並確保在 cmake 步驟啟用 -DBUILD_EXAMPLES=ON 選項時,它能與 OpenCV 庫一起編譯。
  5. 修改您的新頁面
    • 新增頁面標題和識別符號,通常以 "tutorial_" 為字首(參見此處)。您可以使用識別符號新增指向上一篇和下一篇教程的連結。
      @prev_tutorial{identifier}
      @next_tutorial{identifier}
      警告
      不要寫入井號 (#),例如:
      不正確
      @prev_tutorial{#tutorial_documentation} 
      正確
      @prev_tutorial{tutorial_documentation} 
    • 新增您的想法和教程目標的簡要描述。
    • 描述您的程式和/或其有趣的部分。
    • 描述您的結果,插入之前新增的圖片或其他結果。

      要新增 YouTube 影片,例如 www.youtube.com/watch?v= ViPN810E0SU,請使用 youtube{影片 ID}

      @youtube{ViPN810E0SU}
    • 新增參考文獻(如果有)(參見此處)。
  6. 將新建立的教程新增到相應的目錄中。只需找到包含所需表格的 "table_of_content_*.markdown" 檔案,並以與現有記錄類似的方式在其中新增新記錄。

    它只是一個列表項,帶有特殊的 subpage 命令,該命令將您的頁面標記為子頁面並將其放入現有頁面層次結構中。另請注意列表項縮排、段落之間的空行和特殊的 斜體 標記。

  7. 生成 Doxygen 文件並驗證結果。

參考文獻