1 Writing documentation for OpenCV {#tutorial_documentation} 2 ================================ 3 4 @tableofcontents 5 6 Doxygen overview {#tutorial_documentation_overview} 7 ================ 8 9 Intro {#tutorial_documentation_intro} 10 ----- 11 12 [Doxygen] is documentation generation system with a lot of great features, such as: 13 - parse program sources to produce actual and accurate documentation 14 - check documentation for errors 15 - insert images and formulas 16 - use markdown syntax and plain HTML for precise text formatting 17 - generate documentation in many different formats 18 19 OpenCV library existing documentation has been converted to doxygen format. 20 21 Installation {#tutorial_documentation_install} 22 ------------ 23 24 Please, check official [download][Doxygen download] and [installation][Doxygen installation] pages. 25 Some linux distributions can also provide doxygen packages. 26 27 Generate documentation {#tutorial_documentation_generate} 28 ---------------------- 29 30 - Get the OpenCV sources (version 3.0 and later) 31 - _Optional:_ get the OpenCV_contrib sources 32 - Create build directory near the sources folder(s) and go into it 33 - Run cmake (assuming you put sources to _opencv_ folder): 34 @code{.sh} 35 cmake ../opencv 36 @endcode 37 Or if you get contrib sources too: 38 @code{.sh} 39 cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv 40 @endcode 41 - Run make: 42 @code{.sh} 43 make doxygen 44 @endcode 45 - Open <i>doc/doxygen/html/index.html</i> file in your favorite browser 46 47 Quick start {#tutorial_documentation_quick_start} 48 =========== 49 50 @note These instructions are specific to OpenCV library documentation, other projects can use 51 different layout scheme and documenting agreements. 52 53 Documentation locations {#tutorial_documentation_quick_start_1} 54 ----------------------- 55 56 Whole documentation is gathered from many different places: 57 58 - __source code__ entities, like classes, functions or enumerations, should be documented in 59 corresponding header files, right prior entity definition. See examples in next sections. 60 61 - __pages__ are good place to put big pieces of text with images and code examples not directly 62 connected with any source code entity. Pages should be located in separate files and 63 contained in several predefined places. This tutorial is example of such page. 64 65 - __images__ can be used to illustrate described things. Usually located at the same places as pages, 66 images can be inserted to any place of the documentation. 67 68 - __code examples__ show how to use the library in real applications. Each sample is 69 self-contained file which represents one simple application. Parts of these files can be 70 included into documentation and tutorials to demonstrate function calls and objects collaboration. 71 72 - __BibTeX references__ are used to create one common bibliography. All science books, articles and 73 proceedings served as basis for library functionality should be put in this reference list. 74 75 Following scheme represents common documentation places for _opencv_ repository: 76 ~~~ 77 <opencv> 78 doc - doxygen config files, root page (root.markdown.in), BibTeX file (opencv.bib) 79 tutorials - tutorials hierarchy (pages and images) 80 py_tutorials - python tutorials hierarchy (pages and images) 81 modules 82 <modulename> 83 doc - documentation pages and images for module 84 include - code documentation in header files 85 samples - place for all code examples 86 cpp 87 tutorial_code - place for tutorial code examples 88 ... 89 ~~~ 90 91 @note Automatic code parser looks for all header files (<i>".h, .hpp"</i> except for <i>".inl.hpp; 92 .impl.hpp; _detail.hpp"</i>) in _include_ folder and its subfolders. Some module-specific 93 instructions (group definitions) and documentation should be put into 94 <i>"include/opencv2/<module-name>.hpp"</i> file. 95 96 @note You can put C++ template implementation and specialization to separate files 97 (<i>".impl.hpp"</i>) ignored by doxygen. 98 99 @note Files in _src_ subfolder are not parsed, because documentation is intended mostly for the 100 library users, not developers. But it still is possible to generate full documentation by 101 customizing processed files list in cmake script (<i>doc/CMakeLists.txt</i>) and doxygen options in 102 its configuration file (<i>doc/Doxyfile.in</i>). 103 104 Since version 3.0 all new modules are placed into _opencv_contrib_ repository, it has slightly 105 different layout: 106 ~~~ 107 <opencv_contrib> 108 modules 109 <modulename> 110 doc - documentation pages and images, BibTeX file (<modulename>.bib) 111 include - code documentation in header files 112 samples - place for code examples for documentation and tutorials 113 tutorials - tutorial pages and images 114 ~~~ 115 116 Example {#tutorial_documentation_quick_start_2} 117 ------- 118 119 To add documentation for functions, classes and other entities, just insert special comment prior 120 its definition. Like this: 121 122 @verbatim 123 /** @brief Calculates the exponent of every array element. 124 125 The function exp calculates the exponent of every element of the input array: 126 \f[ \texttt{dst} [I] = e^{ src(I) } \f] 127 128 The maximum relative error is about 7e-6 for single-precision input and less than 1e-10 for 129 double-precision input. Currently, the function converts denormalized values to zeros on output. 130 Special values (NaN, Inf) are not handled. 131 132 @param src input array. 133 @param dst output array of the same size and type as src. 134 135 @sa log , cartToPolar , polarToCart , phase , pow , sqrt , magnitude 136 */ 137 CV_EXPORTS_W void exp(InputArray src, OutputArray dst); 138 @endverbatim 139 140 Here you can see: 141 142 - special C-comment syntax denotes it is doxygen comment 143 @verbatim /** ... */ @endverbatim 144 145 - command `brief` denotes following paragraph is a brief description 146 @verbatim @brief @endverbatim 147 148 - empty line denotes paragraph end 149 150 - TeX formula between `f[` and `f]` commands 151 @verbatim \f[ ... \f] @endverbatim 152 153 - command `param` denotes following word is name of the parameter and following text is 154 description of the parameter; all parameters are placed in a list 155 @verbatim @param @endverbatim 156 157 - command `sa` starts "See also" paragraph containing references to some classes, methods, pages or URLs. 158 @verbatim @sa @endverbatim 159 160 Produced reference item looks like this: 161 ![Reference link](doxygen-2.png) 162 163 The "More..." link brings you to the function documentation: 164 ![Function documentation](doxygen-1.png) 165 166 167 Another example {#tutorial_documentation_quick_start_3} 168 --------------- 169 170 Different comment syntax can be used for one-line short comments: 171 172 @verbatim 173 //! type of line 174 enum LineTypes { 175 FILLED = -1, 176 LINE_4 = 4, //!< 4-connected line 177 LINE_8 = 8, //!< 8-connected line 178 LINE_AA = 16 //!< antialiased line 179 }; 180 @endverbatim 181 182 Here: 183 184 - special C++-comment syntax denotes it is doxygen comment 185 @verbatim //! @endverbatim 186 187 - additional symbol `<` denotes this comment is located _after_ documented entity 188 @verbatim //!< @endverbatim 189 190 Produced documentation block looks like this: 191 ![Enumeration documentation](doxygen-3.png) 192 193 More details {#tutorial_documentation_quick_start_4} 194 ------------ 195 196 ### Command prefix 197 198 Doxygen commands starts with `@` or `\` sign: 199 @verbatim 200 @brief ... 201 or 202 \brief ... 203 @endverbatim 204 205 ### Comment syntax 206 207 Doxygen comment can have different forms: 208 @verbatim 209 C-style: 210 /** ... */ 211 or 212 /*! ... */ 213 214 C++-style 215 //! ... 216 or 217 /// ... 218 219 Lines can start with '*': 220 /** 221 * ... 222 * ... 223 */ 224 225 Can be placed after documented entity: 226 //!< ... 227 /**< ... */ 228 @endverbatim 229 230 ### Paragraph end 231 232 To end paragraph, insert empty line or any command starting new paragraph: 233 @verbatim 234 @brief brief description paragraph 235 brief continues 236 237 new paragraph 238 239 @note new note paragraph 240 note paragraph continues 241 242 another paragraph 243 paragraph continues 244 @endverbatim 245 246 ### Naming 247 248 Pages, anchors, groups and other named entities should have unique name inside the whole project. 249 It is a good idea to prefix such identifiers with module name: 250 @verbatim 251 @page core_explanation_1 Usage explanation 252 @defgroup imgproc_transform Image transformations 253 @anchor mymodule_interesting_note 254 @endverbatim 255 256 Supported Markdown {#tutorial_documentation_quick_start_md} 257 ------------------ 258 259 Doxygen supports Markdown formatting with some extensions. Short syntax reference is described 260 below, for details visit [Markdown support]. 261 262 ### lists {#tutorial_documentation_md_list} 263 264 @verbatim 265 Bulleted: 266 - item1 267 - item2 268 Numbered: 269 1. item1 270 2. item2 271 or 272 -# item1 273 -# item2 274 @endverbatim 275 276 ### emphasis {#tutorial_documentation_md_emph} 277 278 @verbatim 279 _italic_ 280 __bold__ 281 use html in complex cases: 282 <em>"path/to/file"</em> 283 @endverbatim 284 285 ### links {#tutorial_documentation_md_links} 286 287 @verbatim 288 explicit link: 289 [OpenCV main site](http://opencv.org) 290 automatic links: 291 <http://opencv.org> 292 or even: 293 http://opencv.org 294 @endverbatim 295 296 ### images {#tutorial_documentation_md_image} 297 298 @verbatim 299 ![image caption](image path) 300 @endverbatim 301 302 ### headers {#tutorial_documentation_md_head} 303 304 @verbatim 305 Level1 306 ====== 307 Level2 308 ------ 309 ### Level3 310 #### Level4 311 @endverbatim 312 313 ### header id {#tutorial_documentation_md_headid} 314 315 You can assign a unique identifier to any header to reference it from other places. 316 @verbatim 317 Header {#some_unique_identifier} 318 ------ 319 ... 320 See @ref some_unique_identifier for details 321 @endverbatim 322 323 ### page id {#tutorial_documentation_md_page} 324 325 Each page should have additional Level1 header at the beginning with page title and identifier: 326 @verbatim 327 Writing documentation for OpenCV {#tutorial_documentation} 328 ================================ 329 @endverbatim 330 331 ### tables {#tutorial_documentation_md_table} 332 333 Example from doxygen documentation: 334 @verbatim 335 First Header | Second Header 336 ------------- | ------------- 337 Content Cell | Content Cell 338 Content Cell | Content Cell 339 @endverbatim 340 341 Commonly used commands {#tutorial_documentation_quick_start_5} 342 ---------------------- 343 344 Most often used doxygen commands are described here with short examples. For the full list of 345 available commands and detailed description, please visit [Command reference]. 346 347 ### Basic commands {#tutorial_documentation_commands_basic} 348 349 - __brief__ - paragraph with brief entity description 350 351 - __param__ - description of function argument. 352 353 Multiple adjacent statements are merged into one list. If argument with this name is not found 354 in actual function signature - doxygen warning will be produced. Function can have either _no_ 355 documented parameters, either _all_ should be documented. 356 357 - __sa__ - "See also" paragraph, contains references to classes, functions, pages or URLs 358 359 - __note__ - visually highlighted "Note" paragraph. Multiple adjacent statements are merged into 360 one block. 361 362 - __return, returns__ - describes returned value of a function 363 364 - __overload__ - adds fixed text to the function description: <em>"This is an overloaded member 365 function, provided for convenience. It differs from the above function only in what argument(s) 366 it accepts."</em> 367 368 - __anchor__ - places invisible named anchor, which can be referenced by `ref` command. It can be 369 used in pages only. 370 371 - __ref__ - explicit reference to a named section, page or anchor. 372 373 If such entity can not be found - doxygen warning will be generated. This command has an 374 optional argument - link text. 375 376 Doxygen also generates some links automatically: if text contains word which can be found in 377 documented entities - reference will be generated. This functionality can be disabled by prefixing 378 the word with `%` symbol. 379 @verbatim 380 Explicit reference: @ref MyClass 381 Explicit named reference: @ref example_page "Example page" 382 Implicit reference: cv::abc::MyClass1 or just MyClass1 383 Disable implicit reference: %MyClass1 384 @endverbatim 385 386 - __f__ - formula 387 388 Inline formulas are bounded with `f$` command: 389 @verbatim 390 \f$ ... \f$ 391 @endverbatim 392 393 Block formulas - with `f[` and `f]` commands: 394 @verbatim 395 \f[ ... \f] 396 @endverbatim 397 398 ### Code inclusion commands {#tutorial_documentation_commands_include} 399 400 To mark some text as a code in documentation, _code_ and _endcode_ commands are used. 401 @verbatim 402 @code 403 float val = img.at<float>(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101), 404 borderInterpolate(-5, img.cols, cv::BORDER_WRAP)); 405 @endcode 406 @endverbatim 407 408 Syntax will be highlighted according to the currently parsed file type (C++ for <em>.hpp</em>, C for <em>.h</em>) or 409 you can manually specify it in curly braces: 410 411 @verbatim 412 @code{.xml} 413 @endverbatim 414 415 To include whole example file into documentation, _include_ and _includelineno_ commands are used. 416 The file is searched in common samples locations, so you can specify just its name or short part of 417 the path. The _includelineno_ version also shows line numbers but prevents copy-pasting since 418 the line numbers are included. 419 420 @verbatim 421 @include samples/cpp/test.cpp 422 @endverbatim 423 424 If you want to include some parts of existing example file - use _snippet_ command. 425 426 First, mark the needed parts of the file with special doxygen comments: 427 @verbatim 428 //! [var_init] 429 int a = 0; 430 //! [var_init] 431 @endverbatim 432 433 Then include this snippet into documentation: 434 @verbatim 435 @snippet samples/cpp/test.cpp var_init 436 @endverbatim 437 438 @note Currently most of such partial inclusions are made with _dontinclude_ command for 439 compatibility with the old rST documentation. But newly created samples should be included with the 440 _snippet_ command, since this method is less affected by the changes in processed file. 441 442 ### Grouping commands {#tutorial_documentation_commands_group} 443 444 All code entities should be put into named groups representing OpenCV modules and their internal 445 structure, thus each module should be associated with a group with the same name. Good place to 446 define groups and subgroups is the main header file for this module: 447 <em>"<module>/include/opencv2/<module>.hpp"</em>. 448 449 @note Doxygen groups are called "modules" and are shown on "Modules" page. 450 451 @verbatim 452 /** 453 @defgroup mymodule My great module 454 optional description 455 @{ 456 @defgroup mymodule_basic Basic operations 457 optional description 458 @defgroup mymodule_experimental Experimental operations 459 optional description 460 @} 461 */ 462 @endverbatim 463 464 To put classes and functions into specific group, just add `ingroup` command to its documentation, 465 or wrap the whole code block with `addtogroup` command: 466 467 @verbatim 468 /** @brief Example function 469 @ingroup mymodule 470 */ 471 or 472 /** 473 @addtogroup mymodule_experimental 474 @{ 475 */ 476 ... several functions, classes or enumerations here 477 /** 478 @} 479 */ 480 @endverbatim 481 482 ### Publication reference {#tutorial_documentation_commands_cite} 483 484 Use _cite_ command to insert reference to related publications listed in @ref citelist page. 485 486 First, add publication BibTeX record into <i>"<opencv>/doc/opencv.bib"</i> or 487 <i>"<opencv_contrib>/modules/<module>/doc/<module>.bib"</i> file: 488 @verbatim 489 @ARTICLE{Bradski98, 490 author = {Bradski, Gary R}, 491 title = {Computer vision face tracking for use in a perceptual user interface}, 492 year = {1998}, 493 publisher = {Citeseer} 494 } 495 @endverbatim 496 497 @note Try not to add publication duplicates because it can confuse documentation readers and writers later. 498 499 Then make reference with _cite_ command: 500 @verbatim 501 @cite Bradski98 502 @endverbatim 503 504 @note To get BibTeX record for the publications one can use [Google Scholar]. Once the publication 505 have been found - follow its "Cite" link and then choose "BibTeX" option: 506 ![](scholarship_cite_dialog.png) 507 508 Step-by-step {#tutorial_documentation_steps} 509 ============ 510 511 Steps described in this section can be used as checklist during documentation writing. It is not 512 necessary to do things in the same order, but some steps really depend on previous. And of course 513 these steps are just basic guidelines, there is always a place for creativity. 514 515 Document the function {#tutorial_documentation_steps_fun} 516 --------------------- 517 518 1. Add empty doxygen comment preceding function definition. 519 2. Add _brief_ command with short description of function meaning at the beginning. 520 3. Add detailed description of the function. 521 4. _Optional_: insert formulas, images and blocks of example code to illustrate complex cases 522 5. _Optional_: describe each parameter using the _param_ command. 523 6. _Optional_: describe return value of the function using the _returns_ command. 524 7. _Optional_: add "See also" section with links to similar functions or classes 525 8. _Optional_: add bibliographic reference if any. 526 9. Generate doxygen documentation and verify results. 527 528 Write the tutorial {#tutorial_documentation_steps_tutorial} 529 ------------------ 530 531 1. Formulate the idea to be illustrated in the tutorial. 532 533 2. Make the example application, simple enough to be understood by a beginning developer. Be 534 laconic and write descriptive comments, don't try to avoid every possible runtime error or to make 535 universal utility. Your goal is to illustrate the idea. And it should fit one source file! 536 537 If you want to insert code blocks from this file into your tutorial, mark them with special doxygen comments (see [here](@ref tutorial_documentation_commands_include)). 538 539 3. Collect results of the application work. It can be "before/after" images or some numbers 540 representing performance or even a video. 541 542 Save it in appropriate format for later use in the tutorial: 543 - To save simple graph-like images use lossless ".png" format. 544 - For photo-like images - lossy ".jpg" format. 545 - Numbers will be inserted as plain text, possibly formatted as table. 546 - Video should be uploaded on YouTube. 547 548 4. Create new tutorial page (<em>".markdown"</em>-file) in corresponding location (see 549 [here](@ref tutorial_documentation_quick_start_1)), and place all image files near it (or in "images" 550 subdirectory). Also put your example application file and make sure it is compiled together with the 551 OpenCV library when `-DBUILD_EXAMPLES=ON` option is enabled on cmake step. 552 553 5. Modify your new page: 554 - Add page title and identifier, usually prefixed with <em>"tutorial_"</em> (see [here](@ref tutorial_documentation_md_page)). 555 - Add brief description of your idea and tutorial goals. 556 - Describe your program and/or its interesting pieces. 557 - Describe your results, insert previously added images or other results. 558 559 To add a video use _htmlonly_, _endhtmlonly_ commands with raw html block inside: 560 @verbatim 561 @htmlonly 562 <div align="center"> 563 <iframe 564 title="my title" width="560" height="349" 565 src="http://www.youtube.com/embed/ViPN810E0SU?rel=0&loop=1" 566 frameborder="0" allowfullscreen align="middle"> 567 </iframe> 568 </div> 569 @endhtmlonly 570 @endverbatim 571 - Add bibliographic references if any (see [here](@ref tutorial_documentation_commands_cite)). 572 573 6. Add newly created tutorial to the corresponding table of contents. Just find 574 <em>"table_of_content_*.markdown"</em> file with the needed table and place new record in it 575 similar to existing ones. 576 @verbatim 577 - @subpage tutorial_windows_visual_studio_image_watch 578 579 _Compatibility:_ \>= OpenCV 2.4 580 581 _Author:_ Wolf Kienzle 582 583 You will learn how to visualize OpenCV matrices and images within Visual Studio 2012. 584 @endverbatim 585 As you can see it is just a list item with special _subpage_ command which marks your page as a 586 child and places it into the existing pages hierarchy. Add compatibility information, 587 authors list and short description. Also note the list item indent, empty lines between 588 paragraphs and special _italic_ markers. 589 590 7. Generate doxygen documentation and verify results. 591 592 References {#tutorial_documentation_refs} 593 ========== 594 - [Doxygen] - main Doxygen page 595 - [Documenting basics] - how to include documentation in code 596 - [Markdown support] - supported syntax and extensions 597 - [Formulas support] - how to include formulas 598 - [Supported formula commands] - HTML formulas use MathJax script for rendering 599 - [Command reference] - supported commands and their parameters 600 601 <!-- invisible references list --> 602 [Doxygen]: http://www.stack.nl/~dimitri/doxygen/index.html) 603 [Doxygen download]: http://www.stack.nl/~dimitri/doxygen/download.html 604 [Doxygen installation]: http://www.stack.nl/~dimitri/doxygen/manual/install.html 605 [Documenting basics]: http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html 606 [Markdown support]: http://www.stack.nl/~dimitri/doxygen/manual/markdown.html 607 [Formulas support]: http://www.stack.nl/~dimitri/doxygen/manual/formulas.html 608 [Supported formula commands]: http://docs.mathjax.org/en/latest/tex.html#supported-latex-commands 609 [Command reference]: http://www.stack.nl/~dimitri/doxygen/manual/commands.html 610 [Google Scholar]: http://scholar.google.ru/ 611