1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*M///////////////////////////////////////////////////////////////////////////////////////
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  By downloading, copying, installing or using the software you agree to this license.
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  If you do not agree to this license, do not download, install,
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  copy or use the software.
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//                          License Agreement
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//                For Open Source Computer Vision Library
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2015, Itseez Inc., all rights reserved.
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Third party copyrights are property of their respective owners.
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Redistribution and use in source and binary forms, with or without modification,
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// are permitted provided that the following conditions are met:
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * Redistribution's of source code must retain the above copyright notice,
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     this list of conditions and the following disclaimer.
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * Redistribution's in binary form must reproduce the above copyright notice,
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     this list of conditions and the following disclaimer in the documentation
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     and/or other materials provided with the distribution.
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * The name of the copyright holders may not be used to endorse or promote products
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     derived from this software without specific prior written permission.
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// This software is provided by the copyright holders and contributors "as is" and
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// any express or implied warranties, including, but not limited to, the implied
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// warranties of merchantability and fitness for a particular purpose are disclaimed.
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// In no event shall the Intel Corporation or contributors be liable for any direct,
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// indirect, incidental, special, exemplary, or consequential damages
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// (including, but not limited to, procurement of substitute goods or services;
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// loss of use, data, or profits; or business interruption) however caused
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and on any theory of liability, whether in contract, strict liability,
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// or tort (including negligence or otherwise) arising in any way out of
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the use of this software, even if advised of the possibility of such damage.
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//M*/
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef __OPENCV_CORE_UTILITY_H__
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define __OPENCV_CORE_UTILITY_H__
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef __cplusplus
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  error utility.hpp header must be compiled as C++
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/core.hpp"
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cv
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef CV_COLLECT_IMPL_DATA
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void setImpl(int flags); // set implementation flags and reset storage arrays
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void addImpl(int flag, const char* func = 0); // add implementation and function name to storage arrays
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Get stored implementation flags and fucntions names arrays
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Each implementation entry correspond to function name entry, so you can find which implementation was executed in which fucntion
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS int getImpl(std::vector<int> &impl, std::vector<String> &funName);
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS bool useCollection(); // return implementation collection state
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void setUseCollection(bool flag); // set implementation collection state
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_PLAIN  0x01 // native CPU OpenCV implementation
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_OCL    0x02 // OpenCL implementation
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_IPP    0x04 // IPP implementation
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_MT     0x10 // multithreaded implementation
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_ADD(impl)                                                   \
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(cv::useCollection())                                                 \
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {                                                                       \
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::addImpl(impl, CV_Func);                                         \
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_IMPL_ADD(impl)
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//! @addtogroup core_utils
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//! @{
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief  Automatically Allocated Buffer Class
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler The class is used for temporary buffers in functions and methods.
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler If a temporary buffer is usually small (a few K's of memory),
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler but its size depends on the parameters, it makes sense to create a small
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fixed-size array on stack and use it if it's large enough. If the required buffer size
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is larger than the fixed size, another buffer of sufficient size is allocated dynamically
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler and released after the processing. Therefore, in typical cases, when the buffer size is small,
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler there is no overhead associated with malloc()/free().
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler At the same time, there is no limit on the size of processed data.
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler This is what AutoBuffer does. The template takes 2 parameters - type of the buffer elements and
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler the number of stack-allocated elements. Here is how the class is used:
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler \code
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void my_func(const cv::Mat& m)
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler {
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::AutoBuffer<float> buf; // create automatic buffer containing 1000 floats
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    buf.allocate(m.rows); // if m.rows <= 1000, the pre-allocated buffer is used,
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                          // otherwise the buffer of "m.rows" floats will be allocated
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                          // dynamically and deallocated in cv::AutoBuffer destructor
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ...
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler \endcode
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size = 1024/sizeof(_Tp)+8> class AutoBuffer
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    typedef _Tp value_type;
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! the default constructor
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoBuffer();
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! constructor taking the real buffer size
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoBuffer(size_t _size);
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! the copy constructor
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoBuffer(const AutoBuffer<_Tp, fixed_size>& buf);
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! the assignment operator
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoBuffer<_Tp, fixed_size>& operator = (const AutoBuffer<_Tp, fixed_size>& buf);
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! destructor. calls deallocate()
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~AutoBuffer();
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! allocates the new buffer of size _size. if the _size is small enough, stack-allocated buffer is used
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void allocate(size_t _size);
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! deallocates the buffer if it was dynamically allocated
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void deallocate();
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! resizes the buffer and preserves the content
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void resize(size_t _size);
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! returns the current buffer size
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t size() const;
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! returns pointer to the real buffer, stack-allocated or head-allocated
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator _Tp* ();
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! returns read-only pointer to the real buffer, stack-allocated or head-allocated
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator const _Tp* () const;
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! pointer to the real buffer, can point to buf if the buffer is small enough
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _Tp* ptr;
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! size of the real buffer
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t sz;
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //! pre-allocated buffer. At least 1 element to confirm C++ standard reqirements
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _Tp buf[(fixed_size > 0) ? fixed_size : 1];
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/**  @brief Sets/resets the break-on-error mode.
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerWhen the break-on-error mode is set, the default error handler issues a hardware exception, which
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercan make debugging more convenient.
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\return the previous state
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS bool setBreakOnError(bool flag);
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern "C" typedef int (*ErrorCallback)( int status, const char* func_name,
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                       const char* err_msg, const char* file_name,
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                       int line, void* userdata );
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Sets the new error handler and the optional user data.
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  The function sets the new error handler, called from cv::error().
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  \param errCallback the new error handler. If NULL, the default error handler is used.
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  \param userdata the optional user data pointer, passed to the callback.
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  \param prevUserdata the optional output parameter where the previous user data pointer is stored
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  \return the previous error handler
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS ErrorCallback redirectError( ErrorCallback errCallback, void* userdata=0, void** prevUserdata=0);
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns a text string formatted using the printf-like expression.
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function acts like sprintf but forms and returns an STL string. It can be used to form an error
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslermessage in the Exception constructor.
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param fmt printf-compatible formatting specifiers.
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS String format( const char* fmt, ... );
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS String tempfile( const char* suffix = 0);
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void glob(String pattern, std::vector<String>& result, bool recursive = false);
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief OpenCV will try to set the number of threads for the next parallel region.
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerIf threads == 0, OpenCV will disable threading optimizations and run all it's functions
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslersequentially. Passing threads \< 0 will reset threads number to system default. This function must
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerbe called outside of parallel region.
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOpenCV will try to run it's functions with specified threads number, but some behaviour differs from
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerframework:
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-   `TBB` – User-defined parallel constructions will run with the same threads number, if
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    another does not specified. If late on user creates own scheduler, OpenCV will be use it.
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-   `OpenMP` – No special defined behaviour.
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-   `Concurrency` – If threads == 1, OpenCV will disable threading optimizations and run it's
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    functions sequentially.
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-   `GCD` – Supports only values \<= 0.
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-   `C=` – No special defined behaviour.
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param nthreads Number of threads used by OpenCV.
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@sa getNumThreads, getThreadNum
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void setNumThreads(int nthreads);
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the number of threads used by OpenCV for parallel regions.
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAlways returns 1 if OpenCV is built without threading support.
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe exact meaning of return value depends on the threading framework used by OpenCV library:
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `TBB` – The number of threads, that OpenCV will try to use for parallel regions. If there is
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  any tbb::thread_scheduler_init in user code conflicting with OpenCV, then function returns
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  default number of threads used by TBB library.
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `OpenMP` – An upper bound on the number of threads that could be used to form a new team.
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `Concurrency` – The number of threads, that OpenCV will try to use for parallel regions.
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `GCD` – Unsupported; returns the GCD thread pool limit (512) for compatibility.
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `C=` – The number of threads, that OpenCV will try to use for parallel regions, if before
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  called setNumThreads with threads \> 0, otherwise returns the number of logical CPUs,
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  available for the process.
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@sa setNumThreads, getThreadNum
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS int getNumThreads();
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the index of the currently executed thread within the current parallel region. Always
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerreturns 0 if called outside of parallel region.
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe exact meaning of return value depends on the threading framework used by OpenCV library:
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `TBB` – Unsupported with current 4.1 TBB release. May be will be supported in future.
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `OpenMP` – The thread number, within the current team, of the calling thread.
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `Concurrency` – An ID for the virtual processor that the current context is executing on (0
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for master thread and unique number for others, but not necessary 1,2,3,...).
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `GCD` – System calling thread's ID. Never returns 0 inside parallel region.
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler- `C=` – The index of the current parallel task.
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@sa setNumThreads, getNumThreads
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS int getThreadNum();
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns full configuration time cmake output.
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerReturned value is raw cmake output including version control system revision, compiler version,
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercompiler flags, enabled modules and third party libraries, etc. Output format depends on target
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerarchitecture.
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W const String& getBuildInformation();
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the number of ticks.
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns the number of ticks after the certain event (for example, when the machine was
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerturned on). It can be used to initialize RNG or to measure a function execution time by reading the
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertick count before and after the function call. See also the tick frequency.
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W int64 getTickCount();
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the number of ticks per second.
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns the number of ticks per second. That is, the following code computes the
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerexecution time in seconds:
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@code
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double t = (double)getTickCount();
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // do something ...
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    t = ((double)getTickCount() - t)/getTickFrequency();
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@endcode
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W double getTickFrequency();
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the number of CPU ticks.
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns the current number of CPU ticks on some architectures (such as x86, x64,
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPowerPC). On other platforms the function is equivalent to getTickCount. It can also be used for
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervery accurate time measurements, as well as for RNG initialization. Note that in case of multi-CPU
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslersystems a thread, from which getCPUTickCount is called, can be suspended and resumed at another CPU
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerwith its own counter. So, theoretically (and practically) the subsequent calls to the function do
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernot necessary return the monotonously increasing values. Also, since a modern CPU varies the CPU
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrequency depending on the load, the number of CPU clocks spent in some code cannot be directly
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconverted to time units. Therefore, getTickCount is generally a preferable solution for measuring
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerexecution time.
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W int64 getCPUTickCount();
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Available CPU features.
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerremember to keep this list identical to the one in cvdef.h
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum CpuFeatures {
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_MMX             = 1,
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSE             = 2,
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSE2            = 3,
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSE3            = 4,
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSSE3           = 5,
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSE4_1          = 6,
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_SSE4_2          = 7,
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_POPCNT          = 8,
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX             = 10,
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX2            = 11,
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_FMA3            = 12,
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512F        = 13,
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512BW       = 14,
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512CD       = 15,
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512DQ       = 16,
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512ER       = 17,
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512IFMA512  = 18,
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512PF       = 19,
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512VBMI     = 20,
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_AVX_512VL       = 21,
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CPU_NEON            = 100
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns true if the specified feature is supported by the host hardware.
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns true if the host hardware supports the specified feature. When user calls
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslersetUseOptimized(false), the subsequent calls to checkHardwareSupport() will return false until
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslersetUseOptimized(true) is called. This way user can dynamically switch on and off the optimized code
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerin OpenCV.
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param feature The feature of interest, one of cv::CpuFeatures
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W bool checkHardwareSupport(int feature);
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the number of logical CPUs available for the process.
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W int getNumberOfCPUs();
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Aligns a pointer to the specified number of bytes.
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns the aligned pointer of the same type as the input pointer:
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\f[\texttt{(\_Tp*)(((size\_t)ptr + n-1) \& -n)}\f]
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param ptr Aligned pointer.
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param n Alignment size that must be a power of two.
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return (_Tp*)(((size_t)ptr + n-1) & -n);
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Aligns a buffer size to the specified number of bytes.
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns the minimum number that is greater or equal to sz and is divisible by n :
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\f[\texttt{(sz + n-1) \& -n}\f]
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param sz Buffer size to align.
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param n Alignment size that must be a power of two.
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic inline size_t alignSize(size_t sz, int n)
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_DbgAssert((n & (n - 1)) == 0); // n is a power of 2
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return (sz + n-1) & -n;
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Enables or disables the optimized code.
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function can be used to dynamically turn on and off optimized code (code that uses SSE2, AVX,
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerand other instructions on the platforms that support it). It sets a global flag that is further
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerchecked by OpenCV functions. Since the flag is not checked in the inner OpenCV loops, it is only
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslersafe to call the function on the very top level in your application where you can be sure that no
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerother OpenCV function is currently executed.
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerBy default, the optimized code is enabled unless you disable it in CMake. The current status can be
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerretrieved using useOptimized.
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@param onoff The boolean flag specifying whether the optimized code should be used (onoff=true)
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presleror not (onoff=false).
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W void setUseOptimized(bool onoff);
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Returns the status of optimized code usage.
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe function returns true if the optimized code is enabled. Otherwise, it returns false.
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS_W bool useOptimized();
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic inline size_t getElemSize(int type) { return CV_ELEM_SIZE(type); }
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////// Parallel Primitives //////////////////////////////////
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Base class for parallel data processors
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS ParallelLoopBody
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual ~ParallelLoopBody();
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void operator() (const Range& range) const = 0;
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Parallel data processor
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body, double nstripes=-1.);
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////// forEach method of cv::Mat ////////////////////////////
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, typename Functor> inline
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid Mat::forEach_impl(const Functor& operation) {
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (false) {
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        operation(*reinterpret_cast<_Tp*>(0), reinterpret_cast<int*>(NULL));
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // If your compiler fail in this line.
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Please check that your functor signature is
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //     (_Tp&, const int*)   <- multidimential
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //  or (_Tp&, void*)        <- in case of you don't need current idx.
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_Assert(this->total() / this->size[this->dims - 1] <= INT_MAX);
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int LINES = static_cast<int>(this->total() / this->size[this->dims - 1]);
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    class PixelOperationWrapper :public ParallelLoopBody
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    public:
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        PixelOperationWrapper(Mat_<_Tp>* const frame, const Functor& _operation)
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            : mat(frame), op(_operation) {};
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        virtual ~PixelOperationWrapper(){};
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // ! Overloaded virtual operator
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // convert range call to row call.
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        virtual void operator()(const Range &range) const {
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const int DIMS = mat->dims;
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const int COLS = mat->size[DIMS - 1];
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (DIMS <= 2) {
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (int row = range.start; row < range.end; ++row) {
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    this->rowCall2(row, COLS);
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                std::vector<int> idx(COLS); /// idx is modified in this->rowCall
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                idx[DIMS - 2] = range.start - 1;
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (int line_num = range.start; line_num < range.end; ++line_num) {
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    idx[DIMS - 2]++;
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    for (int i = DIMS - 2; i >= 0; --i) {
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (idx[i] >= mat->size[i]) {
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            idx[i - 1] += idx[i] / mat->size[i];
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            idx[i] %= mat->size[i];
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            continue; // carry-over;
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        }
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        else {
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            break;
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        }
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    this->rowCall(&idx[0], COLS, DIMS);
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        };
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    private:
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        Mat_<_Tp>* const mat;
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        const Functor op;
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // ! Call operator for each elements in this row.
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        inline void rowCall(int* const idx, const int COLS, const int DIMS) const {
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int &col = idx[DIMS - 1];
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            col = 0;
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _Tp* pixel = &(mat->template at<_Tp>(idx));
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            while (col < COLS) {
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                op(*pixel, const_cast<const int*>(idx));
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                pixel++; col++;
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            col = 0;
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // ! Call operator for each elements in this row. 2d mat special version.
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        inline void rowCall2(const int row, const int COLS) const {
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            union Index{
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int body[2];
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                operator const int*() const {
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return reinterpret_cast<const int*>(this);
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int& operator[](const int i) {
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return body[i];
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } idx = {{row, 0}};
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Special union is needed to avoid
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // "error: array subscript is above array bounds [-Werror=array-bounds]"
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // when call the functor `op` such that access idx[3].
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _Tp* pixel = &(mat->template at<_Tp>(idx));
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const _Tp* const pixel_end = pixel + COLS;
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            while(pixel < pixel_end) {
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                op(*pixel++, static_cast<const int*>(idx));
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                idx[1]++;
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        };
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        PixelOperationWrapper& operator=(const PixelOperationWrapper &) {
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_Assert(false);
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // We can not remove this implementation because Visual Studio warning C4822.
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return *this;
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        };
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    parallel_for_(cv::Range(0, LINES), PixelOperationWrapper(reinterpret_cast<Mat_<_Tp>*>(this), operation));
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////// Synchronization Primitives ///////////////////////////////
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS Mutex
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mutex();
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~Mutex();
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mutex(const Mutex& m);
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mutex& operator = (const Mutex& m);
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void lock();
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool trylock();
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void unlock();
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    struct Impl;
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Impl* impl;
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS AutoLock
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoLock(Mutex& m) : mutex(&m) { mutex->lock(); }
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~AutoLock() { mutex->unlock(); }
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mutex* mutex;
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoLock(const AutoLock&);
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    AutoLock& operator = (const AutoLock&);
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS TLSDataContainer
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int key_;
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TLSDataContainer();
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual ~TLSDataContainer();
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void* createDataInstance() const = 0;
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void deleteDataInstance(void* data) const = 0;
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* getData() const;
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <typename T>
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass TLSData : protected TLSDataContainer
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inline TLSData() {}
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inline ~TLSData() {}
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inline T* get() const { return (T*)getData(); }
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void* createDataInstance() const { return new T; }
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void deleteDataInstance(void* data) const { delete (T*)data; }
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/** @brief Designed for command line parsing
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe sample below demonstrates how to use CommandLineParser:
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@code
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CommandLineParser parser(argc, argv, keys);
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    parser.about("Application name v1.0.0");
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (parser.has("help"))
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        parser.printMessage();
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int N = parser.get<int>("N");
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double fps = parser.get<double>("fps");
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String path = parser.get<String>("path");
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    use_time_stamp = parser.has("timestamp");
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String img1 = parser.get<String>(0);
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String img2 = parser.get<String>(1);
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int repeat = parser.get<int>(2);
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!parser.check())
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        parser.printErrors();
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@endcode
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler### Keys syntax
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerThe keys parameter is a string containing several blocks, each one is enclosed in curley braces and
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdescribes one argument. Each argument contains three parts separated by the `|` symbol:
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-# argument names is a space-separated list of option synonyms (to mark argument as positional, prefix it with the `@` symbol)
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-# default value will be used if the argument was not provided (can be empty)
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler-# help message (can be empty)
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerFor example:
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@code{.cpp}
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const String keys =
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{help h usage ? |      | print this message   }"
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{@image1        |      | image1 for compare   }"
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{@image2        |      | image2 for compare   }"
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{@repeat        |1     | number               }"
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{path           |.     | path to file         }"
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{fps            | -1.0 | fps for output video }"
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{N count        |100   | count of objects     }"
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "{ts timestamp   |      | use time stamp       }"
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ;
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@endcode
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler### Usage
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerFor the described keys:
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@code{.sh}
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    # Good call (3 positional parameters: image1, image2 and repeat; N is 200, ts is true)
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    $ ./app -N=200 1.png 2.jpg 19 -ts
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    # Bad call
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    $ ./app -fps=aaa
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERRORS:
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Exception: can not convert: [aaa] to [double]
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler@endcode
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS CommandLineParser
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Constructor
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Initializes command line parser object
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param argc number of command line arguments (from main())
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param argv array of command line arguments (from main())
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param keys string describing acceptable command line parameters (see class description for syntax)
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CommandLineParser(int argc, const char* const argv[], const String& keys);
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Copy constructor */
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CommandLineParser(const CommandLineParser& parser);
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Assignment operator */
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CommandLineParser& operator = (const CommandLineParser& parser);
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Destructor */
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~CommandLineParser();
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Returns application path
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    This method returns the path to the executable from the command line (`argv[0]`).
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    For example, if the application has been started with such command:
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.sh}
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    $ ./bin/my-executable
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    this method will return `./bin`.
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String getPathToApplication() const;
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Access arguments by name
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Returns argument converted to selected type. If the argument is not known or can not be
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    converted to selected type, the error flag is set (can be checked with @ref check).
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    For example, define:
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.cpp}
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String keys = "{N count||}";
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Call:
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.sh}
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    $ ./my-app -N=20
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    # or
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    $ ./my-app --count=20
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Access:
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.cpp}
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int N = parser.get<int>("N");
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param name name of the argument
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param space_delete remove spaces from the left and right of the string
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @tparam T the argument will be converted to this type if possible
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @note You can access positional arguments by their `@`-prefixed name:
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.cpp}
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    parser.get<String>("@image");
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    template <typename T>
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    T get(const String& name, bool space_delete = true) const
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        T val = T();
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        getByName(name, space_delete, ParamType<T>::type, (void*)&val);
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return val;
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Access positional arguments by index
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Returns argument converted to selected type. Indexes are counted from zero.
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    For example, define:
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.cpp}
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String keys = "{@arg1||}{@arg2||}"
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Call:
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.sh}
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ./my-app abc qwe
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Access arguments:
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @code{.cpp}
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String val_1 = parser.get<String>(0); // returns "abc", arg1
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    String val_2 = parser.get<String>(1); // returns "qwe", arg2
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @endcode
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param index index of the argument
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param space_delete remove spaces from the left and right of the string
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @tparam T the argument will be converted to this type if possible
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    template <typename T>
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    T get(int index, bool space_delete = true) const
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        T val = T();
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        getByIndex(index, space_delete, ParamType<T>::type, (void*)&val);
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return val;
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Check if field was provided in the command line
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @param name argument name to check
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool has(const String& name) const;
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Check for parsing errors
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Returns true if error occured while accessing the parameters (bad conversion, missing arguments,
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    etc.). Call @ref printErrors to print error messages list.
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool check() const;
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Set the about message
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    The about message will be shown when @ref printMessage is called, right before arguments table.
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void about(const String& message);
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Print help message
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    This method will print standard help message containing the about message and arguments description.
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @sa about
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void printMessage() const;
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /** @brief Print list of errors occured
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @sa check
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void printErrors() const;
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void getByName(const String& name, bool space_delete, int type, void* dst) const;
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void getByIndex(int index, bool space_delete, int type, void* dst) const;
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    struct Impl;
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Impl* impl;
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//! @} core_utils
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//! @cond IGNORED
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////// AutoBuffer implementation ////////////////////////////////////////
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::AutoBuffer()
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ptr = buf;
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sz = fixed_size;
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::AutoBuffer(size_t _size)
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ptr = buf;
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sz = fixed_size;
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    allocate(_size);
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::AutoBuffer(const AutoBuffer<_Tp, fixed_size>& abuf )
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ptr = buf;
784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sz = fixed_size;
785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    allocate(abuf.size());
786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( size_t i = 0; i < sz; i++ )
787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ptr[i] = abuf.ptr[i];
788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline AutoBuffer<_Tp, fixed_size>&
791793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::operator = (const AutoBuffer<_Tp, fixed_size>& abuf)
792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( this != &abuf )
794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        deallocate();
796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        allocate(abuf.size());
797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for( size_t i = 0; i < sz; i++ )
798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ptr[i] = abuf.ptr[i];
799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return *this;
801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
804793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::~AutoBuffer()
805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ deallocate(); }
806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline void
808793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::allocate(size_t _size)
809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(_size <= sz)
811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sz = _size;
813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    deallocate();
816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(_size > fixed_size)
817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ptr = new _Tp[_size];
819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sz = _size;
820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline void
824793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::deallocate()
825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( ptr != buf )
827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        delete[] ptr;
829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ptr = buf;
830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sz = fixed_size;
831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline void
835793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::resize(size_t _size)
836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(_size <= sz)
838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sz = _size;
840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t i, prevsize = sz, minsize = MIN(prevsize, _size);
843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _Tp* prevptr = ptr;
844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ptr = _size > fixed_size ? new _Tp[_size] : buf;
846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sz = _size;
847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( ptr != prevptr )
849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for( i = 0; i < minsize; i++ )
850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ptr[i] = prevptr[i];
851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( i = prevsize; i < _size; i++ )
852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ptr[i] = _Tp();
853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( prevptr != buf )
855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        delete[] prevptr;
856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline size_t
859793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::size() const
860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ return sz; }
861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
863793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::operator _Tp* ()
864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ return ptr; }
865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename _Tp, size_t fixed_size> inline
867793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAutoBuffer<_Tp, fixed_size>::operator const _Tp* () const
868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ return ptr; }
869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef OPENCV_NOSTL
871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<> inline std::string CommandLineParser::get<std::string>(int index, bool space_delete) const
872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return get<String>(index, space_delete);
874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<> inline std::string CommandLineParser::get<std::string>(const String& name, bool space_delete) const
876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return get<String>(name, space_delete);
878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // OPENCV_NOSTL
880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//! @endcond
882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} //namespace cv
884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef DISABLE_OPENCV_24_COMPATIBILITY
886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/core/core_c.h"
887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif //__OPENCV_CORE_UTILITY_H__
890