OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
OpenCVのドキュメント作成

前のチュートリアル: 画像の基本操作
次のチュートリアル: 移行ガイド

原著者Maksim Shabunin
互換性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 ファイルを好みのブラウザで開く
  • Test your Python code:
    make check_pylint
    覚え書き
    Pythonコードをテストできるようにするには、cmakeを実行する前に Pylint をインストールしておく必要がある。システムのパッケージマネージャを使うか、pipでインストールできる:
    pip install pylint

クイックスタート

覚え書き
これらの手順はOpenCVライブラリのドキュメントに固有のものであり、他のプロジェクトでは異なるレイアウト方式やドキュメント作成上の取り決めを用いる場合がある。

ドキュメントの配置場所

ドキュメント全体は、さまざまな場所から集められる:

  • クラス・関数・列挙型といった ソースコード の構成要素は、対応するヘッダファイル内の、その構成要素の定義の直前にドキュメント化すべきである。次のセクションの例を参照してほしい。
  • ページ は、画像やコード例を含む、特定のソースコード構成要素に直接結びつかない大きなテキストを置くのに適した場所である。ページは別個のファイルに配置し、いくつかの定められた場所に格納すべきである。このチュートリアルはそうしたページの一例である。
  • 画像 は、説明する内容を図示するのに使える。通常はページと同じ場所に置かれるが、画像はドキュメントの任意の場所に挿入できる。
  • コード例 は、実際のアプリケーションでライブラリをどのように使うかを示す。各サンプルは、1つの単純なアプリケーションを表す自己完結したファイルである。これらのファイルの一部をドキュメントやチュートリアルに取り込んで、関数呼び出しやオブジェクトの連携を示すことができる。
  • BibTeX参照 は、共通の文献目録を1つ作成するために使われる。ライブラリの機能の基礎となったすべての学術書・論文・会議録は、この参照リストに記載すべきである。

次の図は、opencv リポジトリにおける一般的なドキュメントの配置場所を表している:

<opencv>
├── doc - doxygen config files, root page (root.markdown.in), BibTeX file (opencv.bib)
│   ├── tutorials - tutorials hierarchy (pages and images)
│   └── py_tutorials - python tutorials hierarchy (pages and images)
├── modules
│   └── <modulename>
│      ├── doc - documentation pages and images for module
│      └── include - code documentation in header files
└── samples - place for all code examples
├── cpp
│ └── tutorial_code - place for tutorial code examples
└── ...
覚え書き
自動コードパーサは、include フォルダおよびそのサブフォルダ内のすべてのヘッダファイル(".h, .hpp"、ただし ".inl.hpp; .impl.hpp; _detail.hpp" を除く)を探索する。一部のモジュール固有の指示(グループ定義)やドキュメントは、"include/opencv2/<module-name>.hpp" ファイルに置くべきである。
C++のテンプレート実装や特殊化は、doxygenが無視する別個のファイル(".impl.hpp")に置くことができる。
src サブフォルダ内のファイルは解析されない。ドキュメントは主に開発者ではなくライブラリの利用者を対象としているためである。ただし、cmakeスクリプト(doc/CMakeLists.txt)で処理対象ファイルのリストを、設定ファイル(doc/Doxyfile.in)でdoxygenのオプションをカスタマイズすることで、完全なドキュメントを生成することも可能である。

バージョン3.0以降、すべての新しいモジュールは opencv_contrib リポジトリに置かれており、こちらはレイアウトがやや異なる:

<opencv_contrib>
└── modules
└── <modulename>
├── doc - documentation pages and images, BibTeX file (<modulename>.bib)
├── include - code documentation in header files
├── samples - place for code examples for documentation and tutorials
└── tutorials - tutorial pages and images

関数・クラスやその他の構成要素のドキュメントを追加するには、その定義の直前に専用のコメントを挿入するだけでよい。次のように行う:

/** @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への参照を含む「関連項目(See also)」の段落を開始する。
    @sa 

生成される参照項目は次のようになる:

「More...」リンクをたどると、関数のドキュメントに移動する:

別の例

1行の短いコメントには、異なるコメント構文を使うことができる:

//! 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 support を参照のこと。

リスト

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](http://opencv.org)
automatic links:
<http://opencv.org>
or even:
http://opencv.org

画像

![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コマンドを、短い例とともにここで説明する。利用可能なコマンドの完全な一覧と詳細な説明については、Command reference を参照のこと。

基本コマンド

  • brief - エンティティの簡単な説明を記述する段落
  • param - 関数の引数の説明。

    隣接する複数の記述は1つのリストにまとめられる。この名前の引数が実際の関数シグネチャに見つからない場合、doxygenの警告が生成される。関数は、ドキュメント化された引数をまったく持たないか、すべての引数をドキュメント化するかのいずれかでなければならない。

  • sa - "See also"(関連項目)の段落。クラス、関数、ページ、URLへの参照を含む
  • note - 視覚的に強調された"Note"(注意)の段落。隣接する複数の記述は1つのブロックにまとめられる。
  • return, returns - 関数の戻り値を説明する
  • overload - 関数の説明に次の固定テキストを追加する: "This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts."
  • 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]

コード挿入コマンド

ドキュメント内のテキストをコードとしてマークするには、code および endcode コマンドを使用する。

@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}

サンプルファイル全体をドキュメントに含めるには、include および includelineno コマンドを使用する。ファイルは共通のサンプル配置場所から検索されるため、ファイル名やパスの一部を指定するだけでよい。includelineno 版は行番号も表示するが、行番号が含まれるためコピー&ペーストはできなくなる。

@include samples/cpp/test.cpp

既存のサンプルファイルの一部を含めたい場合は、snippet コマンドを使用する。

まず、ファイルの必要な部分を特別なdoxygenコメントでマークする:

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

次に、このスニペットをドキュメントに含める:

@snippet samples/cpp/test.cpp var_init
覚え書き
現在、こうした部分的な挿入の多くは、古いrSTドキュメントとの互換性のために dontinclude コマンドで行われている。しかし新しく作成されたサンプルは snippet コマンドで含めるべきである。この方法は処理対象ファイルの変更による影響を受けにくいためである。

トグルボタン挿入コマンド

トグルボタンは、選択された構成(例: プログラミング言語、OS、IDE)を表示するために使用する。

ドキュメントでボタンを使用するには、add_toggle および end_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

例えば、テキストとcode スニペットを伴うトグルボタンの使用例:

### 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のグループは"modules"(モジュール)と呼ばれ、"Modules"ページに表示される。
/**
@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 Scholar を利用できる。文献が見つかったら、その"Cite"リンクをたどり、"BibTeX"オプションを選択する:

ステップごとの手順

このセクションで説明する手順は、ドキュメント作成時のチェックリストとして使用できる。同じ順序で行う必要はないが、一部の手順は前の手順に依存する。もちろん、これらの手順は基本的なガイドラインにすぎず、創意工夫の余地は常にある。

関数をドキュメント化する

  1. 関数定義の前に空のdoxygenコメントを追加する。
  2. 先頭に、関数の意味を簡潔に説明する brief コマンドを追加する。
  3. 関数の詳細な説明を追加する。
  4. 省略可能: 複雑なケースを説明するために、数式・画像・サンプルコードのブロックを挿入する
  5. 省略可能: param コマンドを使って各引数を説明する。
  6. 省略可能: returns コマンドを使って関数の戻り値を説明する。
  7. 省略可能: 類似する関数やクラスへのリンクを記載した「See also」セクションを追加する
  8. 省略可能: 該当する場合は参考文献を追加する。
  9. コードをテストする。(Python: "make check_pylint")
  10. doxygenドキュメントを生成し、結果を確認する。

チュートリアルを書く

  1. チュートリアルで示したいアイデアを定式化する。
  2. 初心者の開発者でも理解できるくらい十分にシンプルなサンプルアプリケーションを作る。簡潔に書き、分かりやすいコメントを記述し、起こりうるすべての実行時エラーを避けようとしたり、汎用的なユーティリティにしようとしたりしないこと。目的はアイデアを示すことである。そして1つのソースファイルに収まるべきである!

    このファイルのコードブロックをチュートリアルに挿入したい場合は、特別なdoxygenコメントでマークする(こちらを参照)。

    チュートリアルを複数のプログラミング言語で書きたい場合は、コメントとコードを切り替えるためのトグルボタンを使う(こちらを参照)。

  3. アプリケーションの実行結果を収集する。それは「before/after」の画像でも、性能を表す何らかの数値でも、あるいは動画でもよい。

    後でチュートリアルで使用するために、適切な形式で保存する:

    • 単純なグラフ風の画像を保存するには、可逆圧縮の ".png" 形式を使う。
    • 写真風の画像には、非可逆圧縮の ".jpg" 形式を使う。
    • 数値はプレーンテキストとして、場合によっては表形式で整形されて挿入される。
    • 動画はYouTubeにアップロードする。
  4. 対応する場所に新しいチュートリアルページ(".markdown"ファイル)を作成し(こちらを参照)、すべての画像ファイルをその近く(または「images」サブディレクトリ内)に配置する。さらに、サンプルアプリケーションのファイルを置き、cmakeのステップで -DBUILD_EXAMPLES=ON オプションが有効になっているときにOpenCVライブラリと一緒にコンパイルされるようにする。
  5. Modify your new page:
    • Add page title and identifier, usually prefixed with "tutorial_" (see here). You can add a link to the previous and next tutorial using the identifier
      @prev_tutorial{identifier}
      @next_tutorial{identifier}
      警告
      ハッシュタグ (#)書かないこと。例:
      誤り:
      @prev_tutorial{#tutorial_documentation} 
      正しい:
      @prev_tutorial{tutorial_documentation} 
    • アイデアとチュートリアルの目標についての簡単な説明を追加する。
    • プログラムやその興味深い部分を説明する。
    • 結果を説明し、あらかじめ追加しておいた画像やその他の結果を挿入する。

      YouTube動画を追加するには、例えば www.youtube.com/watch?v= ViPN810E0SU の場合、youtube{Video ID} を使う:

      @youtube{ViPN810E0SU}
    • 該当する場合は参考文献を追加する(こちらを参照)。
  6. 新しく作成したチュートリアルを対応する目次に追加する。必要な目次を持つ "table_of_content_*.markdown" ファイルを見つけ、既存のものと同様に新しいレコードをそこに配置するだけである。

    それは単に、特別な subpage コマンドを持つリスト項目であり、ページを子として示し、既存のページ階層に配置する。リスト項目のインデント、段落間の空行、特別な italic マーカーにも注意すること。

  7. doxygenドキュメントを生成し、結果を確認する。

参考文献