Rewrote moments of opencl version.
[profile/ivi/opencv.git] / modules / ocl / include / opencv2 / ocl / ocl.hpp
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
14 // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
15 // Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
16 // Third party copyrights are property of their respective owners.
17 //
18 // Redistribution and use in source and binary forms, with or without modification,
19 // are permitted provided that the following conditions are met:
20 //
21 //   * Redistribution's of source code must retain the above copyright notice,
22 //     this list of conditions and the following disclaimer.
23 //
24 //   * Redistribution's in binary form must reproduce the above copyright notice,
25 //     this list of conditions and the following disclaimer in the documentation
26 //     and/or other materials provided with the distribution.
27 //
28 //   * The name of the copyright holders may not be used to endorse or promote products
29 //     derived from this software without specific prior written permission.
30 //
31 // This software is provided by the copyright holders and contributors "as is" and
32 // any express or implied warranties, including, but not limited to, the implied
33 // warranties of merchantability and fitness for a particular purpose are disclaimed.
34 // In no event shall the Intel Corporation or contributors be liable for any direct,
35 // indirect, incidental, special, exemplary, or consequential damages
36 // (including, but not limited to, procurement of substitute goods or services;
37 // loss of use, data, or profits; or business interruption) however caused
38 // and on any theory of liability, whether in contract, strict liability,
39 // or tort (including negligence or otherwise) arising in any way out of
40 // the use of this software, even if advised of the possibility of such damage.
41 //
42 //M*/
43
44 #ifndef __OPENCV_OCL_HPP__
45 #define __OPENCV_OCL_HPP__
46
47 #include <memory>
48 #include <vector>
49
50 #include "opencv2/core/core.hpp"
51 #include "opencv2/imgproc/imgproc.hpp"
52 #include "opencv2/objdetect/objdetect.hpp"
53 #include "opencv2/features2d/features2d.hpp"
54 #include "opencv2/ml/ml.hpp"
55
56 namespace cv
57 {
58     namespace ocl
59     {
60         enum DeviceType
61         {
62             CVCL_DEVICE_TYPE_DEFAULT     = (1 << 0),
63             CVCL_DEVICE_TYPE_CPU         = (1 << 1),
64             CVCL_DEVICE_TYPE_GPU         = (1 << 2),
65             CVCL_DEVICE_TYPE_ACCELERATOR = (1 << 3),
66             //CVCL_DEVICE_TYPE_CUSTOM      = (1 << 4)
67             CVCL_DEVICE_TYPE_ALL         = 0xFFFFFFFF
68         };
69
70         enum DevMemRW
71         {
72             DEVICE_MEM_R_W = 0,
73             DEVICE_MEM_R_ONLY,
74             DEVICE_MEM_W_ONLY
75         };
76
77         enum DevMemType
78         {
79             DEVICE_MEM_DEFAULT = 0,
80             DEVICE_MEM_AHP,         //alloc host pointer
81             DEVICE_MEM_UHP,         //use host pointer
82             DEVICE_MEM_CHP,         //copy host pointer
83             DEVICE_MEM_PM           //persistent memory
84         };
85
86         // these classes contain OpenCL runtime information
87
88         struct PlatformInfo;
89
90         struct DeviceInfo
91         {
92             int _id; // reserved, don't use it
93
94             DeviceType deviceType;
95             std::string deviceProfile;
96             std::string deviceVersion;
97             std::string deviceName;
98             std::string deviceVendor;
99             int deviceVendorId;
100             std::string deviceDriverVersion;
101             std::string deviceExtensions;
102
103             size_t maxWorkGroupSize;
104             std::vector<size_t> maxWorkItemSizes;
105             int maxComputeUnits;
106             size_t localMemorySize;
107             size_t maxMemAllocSize;
108
109             int deviceVersionMajor;
110             int deviceVersionMinor;
111
112             bool haveDoubleSupport;
113             bool isUnifiedMemory; // 1 means integrated GPU, otherwise this value is 0
114
115             std::string compilationExtraOptions;
116
117             const PlatformInfo* platform;
118
119             DeviceInfo();
120         };
121
122         struct PlatformInfo
123         {
124             int _id; // reserved, don't use it
125
126             std::string platformProfile;
127             std::string platformVersion;
128             std::string platformName;
129             std::string platformVendor;
130             std::string platformExtensons;
131
132             int platformVersionMajor;
133             int platformVersionMinor;
134
135             std::vector<const DeviceInfo*> devices;
136
137             PlatformInfo();
138         };
139
140         //////////////////////////////// Initialization & Info ////////////////////////
141         typedef std::vector<const PlatformInfo*> PlatformsInfo;
142
143         CV_EXPORTS int getOpenCLPlatforms(PlatformsInfo& platforms);
144
145         typedef std::vector<const DeviceInfo*> DevicesInfo;
146
147         CV_EXPORTS int getOpenCLDevices(DevicesInfo& devices, int deviceType = CVCL_DEVICE_TYPE_GPU,
148                 const PlatformInfo* platform = NULL);
149
150         // set device you want to use
151         CV_EXPORTS void setDevice(const DeviceInfo* info);
152
153         //////////////////////////////// Error handling ////////////////////////
154         CV_EXPORTS void error(const char *error_string, const char *file, const int line, const char *func);
155
156         enum FEATURE_TYPE
157         {
158             FEATURE_CL_DOUBLE = 1,
159             FEATURE_CL_UNIFIED_MEM,
160             FEATURE_CL_VER_1_2
161         };
162
163         // Represents OpenCL context, interface
164         class CV_EXPORTS Context
165         {
166         protected:
167             Context() { }
168             ~Context() { }
169         public:
170             static Context* getContext();
171
172             bool supportsFeature(FEATURE_TYPE featureType) const;
173             const DeviceInfo& getDeviceInfo() const;
174
175             const void* getOpenCLContextPtr() const;
176             const void* getOpenCLCommandQueuePtr() const;
177             const void* getOpenCLDeviceIDPtr() const;
178         };
179
180         inline const void *getClContextPtr()
181         {
182             return Context::getContext()->getOpenCLContextPtr();
183         }
184
185         inline const void *getClCommandQueuePtr()
186         {
187             return Context::getContext()->getOpenCLCommandQueuePtr();
188         }
189
190         CV_EXPORTS bool supportsFeature(FEATURE_TYPE featureType);
191
192         CV_EXPORTS void finish();
193
194         enum BINARY_CACHE_MODE
195         {
196             CACHE_NONE    = 0,        // do not cache OpenCL binary
197             CACHE_DEBUG   = 0x1 << 0, // cache OpenCL binary when built in debug mode
198             CACHE_RELEASE = 0x1 << 1, // default behavior, only cache when built in release mode
199             CACHE_ALL     = CACHE_DEBUG | CACHE_RELEASE, // cache opencl binary
200         };
201         //! Enable or disable OpenCL program binary caching onto local disk
202         // After a program (*.cl files in opencl/ folder) is built at runtime, we allow the
203         // compiled OpenCL program to be cached to the path automatically as "path/*.clb"
204         // binary file, which will be reused when the OpenCV executable is started again.
205         //
206         // This feature is enabled by default.
207         CV_EXPORTS void setBinaryDiskCache(int mode = CACHE_RELEASE, cv::String path = "./");
208
209         //! set where binary cache to be saved to
210         CV_EXPORTS void setBinaryPath(const char *path);
211
212         struct ProgramSource
213         {
214             const char* name;
215             const char* programStr;
216             const char* programHash;
217
218             // Cache in memory by name (should be unique). Caching on disk disabled.
219             inline ProgramSource(const char* _name, const char* _programStr)
220                 : name(_name), programStr(_programStr), programHash(NULL)
221             {
222             }
223
224             // Cache in memory by name (should be unique). Caching on disk uses programHash mark.
225             inline ProgramSource(const char* _name, const char* _programStr, const char* _programHash)
226                 : name(_name), programStr(_programStr), programHash(_programHash)
227             {
228             }
229         };
230
231         //! Calls OpenCL kernel. Pass globalThreads = NULL, and cleanUp = true, to finally clean-up without executing.
232         //! Deprecated, will be replaced
233         CV_EXPORTS void openCLExecuteKernelInterop(Context *clCxt,
234                 const cv::ocl::ProgramSource& source, string kernelName,
235                 size_t globalThreads[3], size_t localThreads[3],
236                 std::vector< std::pair<size_t, const void *> > &args,
237                 int channels, int depth, const char *build_options);
238
239         class CV_EXPORTS oclMatExpr;
240         //////////////////////////////// oclMat ////////////////////////////////
241         class CV_EXPORTS oclMat
242         {
243         public:
244             //! default constructor
245             oclMat();
246             //! constructs oclMatrix of the specified size and type (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
247             oclMat(int rows, int cols, int type);
248             oclMat(Size size, int type);
249             //! constucts oclMatrix and fills it with the specified value _s.
250             oclMat(int rows, int cols, int type, const Scalar &s);
251             oclMat(Size size, int type, const Scalar &s);
252             //! copy constructor
253             oclMat(const oclMat &m);
254
255             //! constructor for oclMatrix headers pointing to user-allocated data
256             oclMat(int rows, int cols, int type, void *data, size_t step = Mat::AUTO_STEP);
257             oclMat(Size size, int type, void *data, size_t step = Mat::AUTO_STEP);
258
259             //! creates a matrix header for a part of the bigger matrix
260             oclMat(const oclMat &m, const Range &rowRange, const Range &colRange);
261             oclMat(const oclMat &m, const Rect &roi);
262
263             //! builds oclMat from Mat. Perfom blocking upload to device.
264             explicit oclMat (const Mat &m);
265
266             //! destructor - calls release()
267             ~oclMat();
268
269             //! assignment operators
270             oclMat &operator = (const oclMat &m);
271             //! assignment operator. Perfom blocking upload to device.
272             oclMat &operator = (const Mat &m);
273             oclMat &operator = (const oclMatExpr& expr);
274
275             //! pefroms blocking upload data to oclMat.
276             void upload(const cv::Mat &m);
277
278
279             //! downloads data from device to host memory. Blocking calls.
280             operator Mat() const;
281             void download(cv::Mat &m) const;
282
283             //! convert to _InputArray
284             operator _InputArray();
285
286             //! convert to _OutputArray
287             operator _OutputArray();
288
289             //! returns a new oclMatrix header for the specified row
290             oclMat row(int y) const;
291             //! returns a new oclMatrix header for the specified column
292             oclMat col(int x) const;
293             //! ... for the specified row span
294             oclMat rowRange(int startrow, int endrow) const;
295             oclMat rowRange(const Range &r) const;
296             //! ... for the specified column span
297             oclMat colRange(int startcol, int endcol) const;
298             oclMat colRange(const Range &r) const;
299
300             //! returns deep copy of the oclMatrix, i.e. the data is copied
301             oclMat clone() const;
302
303             //! copies those oclMatrix elements to "m" that are marked with non-zero mask elements.
304             // It calls m.create(this->size(), this->type()).
305             // It supports any data type
306             void copyTo( oclMat &m, const oclMat &mask = oclMat()) const;
307
308             //! converts oclMatrix to another datatype with optional scalng. See cvConvertScale.
309             //It supports 8UC1 8UC4 32SC1 32SC4 32FC1 32FC4
310             void convertTo( oclMat &m, int rtype, double alpha = 1, double beta = 0 ) const;
311
312             void assignTo( oclMat &m, int type = -1 ) const;
313
314             //! sets every oclMatrix element to s
315             //It supports 8UC1 8UC4 32SC1 32SC4 32FC1 32FC4
316             oclMat& operator = (const Scalar &s);
317             //! sets some of the oclMatrix elements to s, according to the mask
318             //It supports 8UC1 8UC4 32SC1 32SC4 32FC1 32FC4
319             oclMat& setTo(const Scalar &s, const oclMat &mask = oclMat());
320             //! creates alternative oclMatrix header for the same data, with different
321             // number of channels and/or different number of rows. see cvReshape.
322             oclMat reshape(int cn, int rows = 0) const;
323
324             //! allocates new oclMatrix data unless the oclMatrix already has specified size and type.
325             // previous data is unreferenced if needed.
326             void create(int rows, int cols, int type);
327             void create(Size size, int type);
328
329             //! allocates new oclMatrix with specified device memory type.
330             void createEx(int rows, int cols, int type, DevMemRW rw_type, DevMemType mem_type);
331             void createEx(Size size, int type, DevMemRW rw_type, DevMemType mem_type);
332
333             //! decreases reference counter;
334             // deallocate the data when reference counter reaches 0.
335             void release();
336
337             //! swaps with other smart pointer
338             void swap(oclMat &mat);
339
340             //! locates oclMatrix header within a parent oclMatrix. See below
341             void locateROI( Size &wholeSize, Point &ofs ) const;
342             //! moves/resizes the current oclMatrix ROI inside the parent oclMatrix.
343             oclMat& adjustROI( int dtop, int dbottom, int dleft, int dright );
344             //! extracts a rectangular sub-oclMatrix
345             // (this is a generalized form of row, rowRange etc.)
346             oclMat operator()( Range rowRange, Range colRange ) const;
347             oclMat operator()( const Rect &roi ) const;
348
349             oclMat& operator+=( const oclMat& m );
350             oclMat& operator-=( const oclMat& m );
351             oclMat& operator*=( const oclMat& m );
352             oclMat& operator/=( const oclMat& m );
353
354             //! returns true if the oclMatrix data is continuous
355             // (i.e. when there are no gaps between successive rows).
356             // similar to CV_IS_oclMat_CONT(cvoclMat->type)
357             bool isContinuous() const;
358             //! returns element size in bytes,
359             // similar to CV_ELEM_SIZE(cvMat->type)
360             size_t elemSize() const;
361             //! returns the size of element channel in bytes.
362             size_t elemSize1() const;
363             //! returns element type, similar to CV_MAT_TYPE(cvMat->type)
364             int type() const;
365             //! returns element type, i.e. 8UC3 returns 8UC4 because in ocl
366             //! 3 channels element actually use 4 channel space
367             int ocltype() const;
368             //! returns element type, similar to CV_MAT_DEPTH(cvMat->type)
369             int depth() const;
370             //! returns element type, similar to CV_MAT_CN(cvMat->type)
371             int channels() const;
372             //! returns element type, return 4 for 3 channels element,
373             //!becuase 3 channels element actually use 4 channel space
374             int oclchannels() const;
375             //! returns step/elemSize1()
376             size_t step1() const;
377             //! returns oclMatrix size:
378             // width == number of columns, height == number of rows
379             Size size() const;
380             //! returns true if oclMatrix data is NULL
381             bool empty() const;
382
383             //! returns pointer to y-th row
384             uchar* ptr(int y = 0);
385             const uchar *ptr(int y = 0) const;
386
387             //! template version of the above method
388             template<typename _Tp> _Tp *ptr(int y = 0);
389             template<typename _Tp> const _Tp *ptr(int y = 0) const;
390
391             //! matrix transposition
392             oclMat t() const;
393
394             /*! includes several bit-fields:
395               - the magic signature
396               - continuity flag
397               - depth
398               - number of channels
399               */
400             int flags;
401             //! the number of rows and columns
402             int rows, cols;
403             //! a distance between successive rows in bytes; includes the gap if any
404             size_t step;
405             //! pointer to the data(OCL memory object)
406             uchar *data;
407
408             //! pointer to the reference counter;
409             // when oclMatrix points to user-allocated data, the pointer is NULL
410             int *refcount;
411
412             //! helper fields used in locateROI and adjustROI
413             //datastart and dataend are not used in current version
414             uchar *datastart;
415             uchar *dataend;
416
417             //! OpenCL context associated with the oclMat object.
418             Context *clCxt; // TODO clCtx
419             //add offset for handle ROI, calculated in byte
420             int offset;
421             //add wholerows and wholecols for the whole matrix, datastart and dataend are no longer used
422             int wholerows;
423             int wholecols;
424         };
425
426         // convert InputArray/OutputArray to oclMat references
427         CV_EXPORTS oclMat& getOclMatRef(InputArray src);
428         CV_EXPORTS oclMat& getOclMatRef(OutputArray src);
429
430         ///////////////////// mat split and merge /////////////////////////////////
431         //! Compose a multi-channel array from several single-channel arrays
432         // Support all types
433         CV_EXPORTS void merge(const oclMat *src, size_t n, oclMat &dst);
434         CV_EXPORTS void merge(const vector<oclMat> &src, oclMat &dst);
435
436         //! Divides multi-channel array into several single-channel arrays
437         // Support all types
438         CV_EXPORTS void split(const oclMat &src, oclMat *dst);
439         CV_EXPORTS void split(const oclMat &src, vector<oclMat> &dst);
440
441         ////////////////////////////// Arithmetics ///////////////////////////////////
442
443         //! adds one matrix to another with scale (dst = src1 * alpha + src2 * beta + gama)
444         // supports all data types
445         CV_EXPORTS void addWeighted(const oclMat &src1, double  alpha, const oclMat &src2, double beta, double gama, oclMat &dst);
446
447         //! adds one matrix to another (dst = src1 + src2)
448         // supports all data types
449         CV_EXPORTS void add(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
450         //! adds scalar to a matrix (dst = src1 + s)
451         // supports all data types
452         CV_EXPORTS void add(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
453
454         //! subtracts one matrix from another (dst = src1 - src2)
455         // supports all data types
456         CV_EXPORTS void subtract(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
457         //! subtracts scalar from a matrix (dst = src1 - s)
458         // supports all data types
459         CV_EXPORTS void subtract(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
460
461         //! computes element-wise product of the two arrays (dst = src1 * scale * src2)
462         // supports all data types
463         CV_EXPORTS void multiply(const oclMat &src1, const oclMat &src2, oclMat &dst, double scale = 1);
464         //! multiplies matrix to a number (dst = scalar * src)
465         // supports all data types
466         CV_EXPORTS void multiply(double scalar, const oclMat &src, oclMat &dst);
467
468         //! computes element-wise quotient of the two arrays (dst = src1 * scale / src2)
469         // supports all data types
470         CV_EXPORTS void divide(const oclMat &src1, const oclMat &src2, oclMat &dst, double scale = 1);
471         //! computes element-wise quotient of the two arrays (dst = scale / src)
472         // supports all data types
473         CV_EXPORTS void divide(double scale, const oclMat &src1, oclMat &dst);
474
475         //! computes element-wise minimum of the two arrays (dst = min(src1, src2))
476         // supports all data types
477         CV_EXPORTS void min(const oclMat &src1, const oclMat &src2, oclMat &dst);
478
479         //! computes element-wise maximum of the two arrays (dst = max(src1, src2))
480         // supports all data types
481         CV_EXPORTS void max(const oclMat &src1, const oclMat &src2, oclMat &dst);
482
483         //! compares elements of two arrays (dst = src1 <cmpop> src2)
484         // supports all data types
485         CV_EXPORTS void compare(const oclMat &src1, const oclMat &src2, oclMat &dst, int cmpop);
486
487         //! transposes the matrix
488         // supports all data types
489         CV_EXPORTS void transpose(const oclMat &src, oclMat &dst);
490
491         //! computes element-wise absolute values of an array (dst = abs(src))
492         // supports all data types
493         CV_EXPORTS void abs(const oclMat &src, oclMat &dst);
494
495         //! computes element-wise absolute difference of two arrays (dst = abs(src1 - src2))
496         // supports all data types
497         CV_EXPORTS void absdiff(const oclMat &src1, const oclMat &src2, oclMat &dst);
498         //! computes element-wise absolute difference of array and scalar (dst = abs(src1 - s))
499         // supports all data types
500         CV_EXPORTS void absdiff(const oclMat &src1, const Scalar &s, oclMat &dst);
501
502         //! computes mean value and standard deviation of all or selected array elements
503         // supports all data types
504         CV_EXPORTS void meanStdDev(const oclMat &mtx, Scalar &mean, Scalar &stddev);
505
506         //! computes norm of array
507         // supports NORM_INF, NORM_L1, NORM_L2
508         // supports all data types
509         CV_EXPORTS double norm(const oclMat &src1, int normType = NORM_L2);
510
511         //! computes norm of the difference between two arrays
512         // supports NORM_INF, NORM_L1, NORM_L2
513         // supports all data types
514         CV_EXPORTS double norm(const oclMat &src1, const oclMat &src2, int normType = NORM_L2);
515
516         //! reverses the order of the rows, columns or both in a matrix
517         // supports all types
518         CV_EXPORTS void flip(const oclMat &src, oclMat &dst, int flipCode);
519
520         //! computes sum of array elements
521         // support all types
522         CV_EXPORTS Scalar sum(const oclMat &m);
523         CV_EXPORTS Scalar absSum(const oclMat &m);
524         CV_EXPORTS Scalar sqrSum(const oclMat &m);
525
526         //! finds global minimum and maximum array elements and returns their values
527         // support all C1 types
528         CV_EXPORTS void minMax(const oclMat &src, double *minVal, double *maxVal = 0, const oclMat &mask = oclMat());
529
530         //! finds global minimum and maximum array elements and returns their values with locations
531         // support all C1 types
532         CV_EXPORTS void minMaxLoc(const oclMat &src, double *minVal, double *maxVal = 0, Point *minLoc = 0, Point *maxLoc = 0,
533                                   const oclMat &mask = oclMat());
534
535         //! counts non-zero array elements
536         // support all types
537         CV_EXPORTS int countNonZero(const oclMat &src);
538
539         //! transforms 8-bit unsigned integers using lookup table: dst(i)=lut(src(i))
540         // destination array will have the depth type as lut and the same channels number as source
541         //It supports 8UC1 8UC4 only
542         CV_EXPORTS void LUT(const oclMat &src, const oclMat &lut, oclMat &dst);
543
544         //! only 8UC1 and 256 bins is supported now
545         CV_EXPORTS void calcHist(const oclMat &mat_src, oclMat &mat_hist);
546         //! only 8UC1 and 256 bins is supported now
547         CV_EXPORTS void equalizeHist(const oclMat &mat_src, oclMat &mat_dst);
548
549         //! only 8UC1 is supported now
550         CV_EXPORTS Ptr<cv::CLAHE> createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8));
551
552         //! bilateralFilter
553         // supports 8UC1 8UC4
554         CV_EXPORTS void bilateralFilter(const oclMat& src, oclMat& dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT);
555
556         //! Applies an adaptive bilateral filter to the input image
557         //  This is not truly a bilateral filter. Instead of using user provided fixed parameters,
558         //  the function calculates a constant at each window based on local standard deviation,
559         //  and use this constant to do filtering.
560         //  supports 8UC1, 8UC3
561         CV_EXPORTS void adaptiveBilateralFilter(const oclMat& src, oclMat& dst, Size ksize, double sigmaSpace, Point anchor = Point(-1, -1), int borderType=BORDER_DEFAULT);
562
563         //! computes exponent of each matrix element (dst = e**src)
564         // supports only CV_32FC1, CV_64FC1 type
565         CV_EXPORTS void exp(const oclMat &src, oclMat &dst);
566
567         //! computes natural logarithm of absolute value of each matrix element: dst = log(abs(src))
568         // supports only CV_32FC1, CV_64FC1 type
569         CV_EXPORTS void log(const oclMat &src, oclMat &dst);
570
571         //! computes magnitude of each (x(i), y(i)) vector
572         // supports only CV_32F, CV_64F type
573         CV_EXPORTS void magnitude(const oclMat &x, const oclMat &y, oclMat &magnitude);
574
575         //! computes angle (angle(i)) of each (x(i), y(i)) vector
576         // supports only CV_32F, CV_64F type
577         CV_EXPORTS void phase(const oclMat &x, const oclMat &y, oclMat &angle, bool angleInDegrees = false);
578
579         //! the function raises every element of tne input array to p
580         // support only CV_32F, CV_64F type
581         CV_EXPORTS void pow(const oclMat &x, double p, oclMat &y);
582
583         //! converts Cartesian coordinates to polar
584         // supports only CV_32F CV_64F type
585         CV_EXPORTS void cartToPolar(const oclMat &x, const oclMat &y, oclMat &magnitude, oclMat &angle, bool angleInDegrees = false);
586
587         //! converts polar coordinates to Cartesian
588         // supports only CV_32F CV_64F type
589         CV_EXPORTS void polarToCart(const oclMat &magnitude, const oclMat &angle, oclMat &x, oclMat &y, bool angleInDegrees = false);
590
591         //! perfroms per-elements bit-wise inversion
592         // supports all types
593         CV_EXPORTS void bitwise_not(const oclMat &src, oclMat &dst);
594
595         //! calculates per-element bit-wise disjunction of two arrays
596         // supports all types
597         CV_EXPORTS void bitwise_or(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
598         CV_EXPORTS void bitwise_or(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
599
600         //! calculates per-element bit-wise conjunction of two arrays
601         // supports all types
602         CV_EXPORTS void bitwise_and(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
603         CV_EXPORTS void bitwise_and(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
604
605         //! calculates per-element bit-wise "exclusive or" operation
606         // supports all types
607         CV_EXPORTS void bitwise_xor(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
608         CV_EXPORTS void bitwise_xor(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
609
610         //! Logical operators
611         CV_EXPORTS oclMat operator ~ (const oclMat &);
612         CV_EXPORTS oclMat operator | (const oclMat &, const oclMat &);
613         CV_EXPORTS oclMat operator & (const oclMat &, const oclMat &);
614         CV_EXPORTS oclMat operator ^ (const oclMat &, const oclMat &);
615
616
617         //! Mathematics operators
618         CV_EXPORTS oclMatExpr operator + (const oclMat &src1, const oclMat &src2);
619         CV_EXPORTS oclMatExpr operator - (const oclMat &src1, const oclMat &src2);
620         CV_EXPORTS oclMatExpr operator * (const oclMat &src1, const oclMat &src2);
621         CV_EXPORTS oclMatExpr operator / (const oclMat &src1, const oclMat &src2);
622
623         //! computes convolution of two images
624         // support only CV_32FC1 type
625         CV_EXPORTS void convolve(const oclMat &image, const oclMat &temp1, oclMat &result);
626
627         CV_EXPORTS void cvtColor(const oclMat &src, oclMat &dst, int code, int dcn = 0);
628
629         //! initializes a scaled identity matrix
630         CV_EXPORTS void setIdentity(oclMat& src, const Scalar & val = Scalar(1));
631
632         //////////////////////////////// Filter Engine ////////////////////////////////
633
634         /*!
635           The Base Class for 1D or Row-wise Filters
636
637           This is the base class for linear or non-linear filters that process 1D data.
638           In particular, such filters are used for the "horizontal" filtering parts in separable filters.
639           */
640         class CV_EXPORTS BaseRowFilter_GPU
641         {
642         public:
643             BaseRowFilter_GPU(int ksize_, int anchor_, int bordertype_) : ksize(ksize_), anchor(anchor_), bordertype(bordertype_) {}
644             virtual ~BaseRowFilter_GPU() {}
645             virtual void operator()(const oclMat &src, oclMat &dst) = 0;
646             int ksize, anchor, bordertype;
647         };
648
649         /*!
650           The Base Class for Column-wise Filters
651
652           This is the base class for linear or non-linear filters that process columns of 2D arrays.
653           Such filters are used for the "vertical" filtering parts in separable filters.
654           */
655         class CV_EXPORTS BaseColumnFilter_GPU
656         {
657         public:
658             BaseColumnFilter_GPU(int ksize_, int anchor_, int bordertype_) : ksize(ksize_), anchor(anchor_), bordertype(bordertype_) {}
659             virtual ~BaseColumnFilter_GPU() {}
660             virtual void operator()(const oclMat &src, oclMat &dst) = 0;
661             int ksize, anchor, bordertype;
662         };
663
664         /*!
665           The Base Class for Non-Separable 2D Filters.
666
667           This is the base class for linear or non-linear 2D filters.
668           */
669         class CV_EXPORTS BaseFilter_GPU
670         {
671         public:
672             BaseFilter_GPU(const Size &ksize_, const Point &anchor_, const int &borderType_)
673                 : ksize(ksize_), anchor(anchor_), borderType(borderType_) {}
674             virtual ~BaseFilter_GPU() {}
675             virtual void operator()(const oclMat &src, oclMat &dst) = 0;
676             Size ksize;
677             Point anchor;
678             int borderType;
679         };
680
681         /*!
682           The Base Class for Filter Engine.
683
684           The class can be used to apply an arbitrary filtering operation to an image.
685           It contains all the necessary intermediate buffers.
686           */
687         class CV_EXPORTS FilterEngine_GPU
688         {
689         public:
690             virtual ~FilterEngine_GPU() {}
691
692             virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1)) = 0;
693         };
694
695         //! returns the non-separable filter engine with the specified filter
696         CV_EXPORTS Ptr<FilterEngine_GPU> createFilter2D_GPU(const Ptr<BaseFilter_GPU> filter2D);
697
698         //! returns the primitive row filter with the specified kernel
699         CV_EXPORTS Ptr<BaseRowFilter_GPU> getLinearRowFilter_GPU(int srcType, int bufType, const Mat &rowKernel,
700                 int anchor = -1, int bordertype = BORDER_DEFAULT);
701
702         //! returns the primitive column filter with the specified kernel
703         CV_EXPORTS Ptr<BaseColumnFilter_GPU> getLinearColumnFilter_GPU(int bufType, int dstType, const Mat &columnKernel,
704                 int anchor = -1, int bordertype = BORDER_DEFAULT, double delta = 0.0);
705
706         //! returns the separable linear filter engine
707         CV_EXPORTS Ptr<FilterEngine_GPU> createSeparableLinearFilter_GPU(int srcType, int dstType, const Mat &rowKernel,
708                 const Mat &columnKernel, const Point &anchor = Point(-1, -1), double delta = 0.0, int bordertype = BORDER_DEFAULT);
709
710         //! returns the separable filter engine with the specified filters
711         CV_EXPORTS Ptr<FilterEngine_GPU> createSeparableFilter_GPU(const Ptr<BaseRowFilter_GPU> &rowFilter,
712                 const Ptr<BaseColumnFilter_GPU> &columnFilter);
713
714         //! returns the Gaussian filter engine
715         CV_EXPORTS Ptr<FilterEngine_GPU> createGaussianFilter_GPU(int type, Size ksize, double sigma1, double sigma2 = 0, int bordertype = BORDER_DEFAULT);
716
717         //! returns filter engine for the generalized Sobel operator
718         CV_EXPORTS Ptr<FilterEngine_GPU> createDerivFilter_GPU( int srcType, int dstType, int dx, int dy, int ksize, int borderType = BORDER_DEFAULT );
719
720         //! applies Laplacian operator to the image
721         // supports only ksize = 1 and ksize = 3
722         CV_EXPORTS void Laplacian(const oclMat &src, oclMat &dst, int ddepth, int ksize = 1, double scale = 1,
723                 double delta=0, int borderType=BORDER_DEFAULT);
724
725         //! returns 2D box filter
726         // dst type must be the same as source type
727         CV_EXPORTS Ptr<BaseFilter_GPU> getBoxFilter_GPU(int srcType, int dstType,
728                 const Size &ksize, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
729
730         //! returns box filter engine
731         CV_EXPORTS Ptr<FilterEngine_GPU> createBoxFilter_GPU(int srcType, int dstType, const Size &ksize,
732                 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
733
734         //! returns 2D filter with the specified kernel
735         // supports: dst type must be the same as source type
736         CV_EXPORTS Ptr<BaseFilter_GPU> getLinearFilter_GPU(int srcType, int dstType, const Mat &kernel, const Size &ksize,
737                 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
738
739         //! returns the non-separable linear filter engine
740         // supports: dst type must be the same as source type
741         CV_EXPORTS Ptr<FilterEngine_GPU> createLinearFilter_GPU(int srcType, int dstType, const Mat &kernel,
742                 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
743
744         //! smooths the image using the normalized box filter
745         CV_EXPORTS void boxFilter(const oclMat &src, oclMat &dst, int ddepth, Size ksize,
746                                   Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
747
748         //! returns 2D morphological filter
749         //! only MORPH_ERODE and MORPH_DILATE are supported
750         // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
751         // kernel must have CV_8UC1 type, one rows and cols == ksize.width * ksize.height
752         CV_EXPORTS Ptr<BaseFilter_GPU> getMorphologyFilter_GPU(int op, int type, const Mat &kernel, const Size &ksize,
753                 Point anchor = Point(-1, -1));
754
755         //! returns morphological filter engine. Only MORPH_ERODE and MORPH_DILATE are supported.
756         CV_EXPORTS Ptr<FilterEngine_GPU> createMorphologyFilter_GPU(int op, int type, const Mat &kernel,
757                 const Point &anchor = Point(-1, -1), int iterations = 1);
758
759         //! a synonym for normalized box filter
760         static inline void blur(const oclMat &src, oclMat &dst, Size ksize, Point anchor = Point(-1, -1),
761                                 int borderType = BORDER_CONSTANT)
762         {
763             boxFilter(src, dst, -1, ksize, anchor, borderType);
764         }
765
766         //! applies non-separable 2D linear filter to the image
767         CV_EXPORTS void filter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernel,
768                                  Point anchor = Point(-1, -1), double delta = 0.0, int borderType = BORDER_DEFAULT);
769
770         //! applies separable 2D linear filter to the image
771         CV_EXPORTS void sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernelX, const Mat &kernelY,
772                                     Point anchor = Point(-1, -1), double delta = 0.0, int bordertype = BORDER_DEFAULT);
773
774         //! applies generalized Sobel operator to the image
775         // dst.type must equalize src.type
776         // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
777         // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
778         CV_EXPORTS void Sobel(const oclMat &src, oclMat &dst, int ddepth, int dx, int dy, int ksize = 3, double scale = 1, double delta = 0.0, int bordertype = BORDER_DEFAULT);
779
780         //! applies the vertical or horizontal Scharr operator to the image
781         // dst.type must equalize src.type
782         // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
783         // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
784         CV_EXPORTS void Scharr(const oclMat &src, oclMat &dst, int ddepth, int dx, int dy, double scale = 1, double delta = 0.0, int bordertype = BORDER_DEFAULT);
785
786         //! smooths the image using Gaussian filter.
787         // dst.type must equalize src.type
788         // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
789         // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
790         CV_EXPORTS void GaussianBlur(const oclMat &src, oclMat &dst, Size ksize, double sigma1, double sigma2 = 0, int bordertype = BORDER_DEFAULT);
791
792         //! erodes the image (applies the local minimum operator)
793         // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
794         CV_EXPORTS void erode( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
795
796                                int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
797
798
799         //! dilates the image (applies the local maximum operator)
800         // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
801         CV_EXPORTS void dilate( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
802
803                                 int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
804
805
806         //! applies an advanced morphological operation to the image
807         CV_EXPORTS void morphologyEx( const oclMat &src, oclMat &dst, int op, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
808
809                                       int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
810
811
812         ////////////////////////////// Image processing //////////////////////////////
813         //! Does mean shift filtering on GPU.
814         CV_EXPORTS void meanShiftFiltering(const oclMat &src, oclMat &dst, int sp, int sr,
815                                            TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
816
817         //! Does mean shift procedure on GPU.
818         CV_EXPORTS void meanShiftProc(const oclMat &src, oclMat &dstr, oclMat &dstsp, int sp, int sr,
819                                       TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
820
821         //! Does mean shift segmentation with elimiation of small regions.
822         CV_EXPORTS void meanShiftSegmentation(const oclMat &src, Mat &dst, int sp, int sr, int minsize,
823                                               TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
824
825         //! applies fixed threshold to the image.
826         // supports CV_8UC1 and CV_32FC1 data type
827         // supports threshold type: THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV
828         CV_EXPORTS double threshold(const oclMat &src, oclMat &dst, double thresh, double maxVal, int type = THRESH_TRUNC);
829
830         //! resizes the image
831         // Supports INTER_NEAREST, INTER_LINEAR
832         // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
833         CV_EXPORTS void resize(const oclMat &src, oclMat &dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
834
835         //! Applies a generic geometrical transformation to an image.
836
837         // Supports INTER_NEAREST, INTER_LINEAR.
838         // Map1 supports CV_16SC2, CV_32FC2  types.
839         // Src supports CV_8UC1, CV_8UC2, CV_8UC4.
840         CV_EXPORTS void remap(const oclMat &src, oclMat &dst, oclMat &map1, oclMat &map2, int interpolation, int bordertype, const Scalar &value = Scalar());
841
842         //! copies 2D array to a larger destination array and pads borders with user-specifiable constant
843         // supports CV_8UC1, CV_8UC4, CV_32SC1 types
844         CV_EXPORTS void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int boardtype, const Scalar &value = Scalar());
845
846         //! Smoothes image using median filter
847         // The source 1- or 4-channel image. m should be 3 or 5, the image depth should be CV_8U or CV_32F.
848         CV_EXPORTS void medianFilter(const oclMat &src, oclMat &dst, int m);
849
850         //! warps the image using affine transformation
851         // Supports INTER_NEAREST, INTER_LINEAR, INTER_CUBIC
852         // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
853         CV_EXPORTS void warpAffine(const oclMat &src, oclMat &dst, const Mat &M, Size dsize, int flags = INTER_LINEAR);
854
855         //! warps the image using perspective transformation
856         // Supports INTER_NEAREST, INTER_LINEAR, INTER_CUBIC
857         // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
858         CV_EXPORTS void warpPerspective(const oclMat &src, oclMat &dst, const Mat &M, Size dsize, int flags = INTER_LINEAR);
859
860         //! computes the integral image and integral for the squared image
861         // sum will have CV_32S type, sqsum - CV32F type
862         // supports only CV_8UC1 source type
863         CV_EXPORTS void integral(const oclMat &src, oclMat &sum, oclMat &sqsum);
864         CV_EXPORTS void integral(const oclMat &src, oclMat &sum);
865         CV_EXPORTS void cornerHarris(const oclMat &src, oclMat &dst, int blockSize, int ksize, double k, int bordertype = cv::BORDER_DEFAULT);
866         CV_EXPORTS void cornerHarris_dxdy(const oclMat &src, oclMat &dst, oclMat &Dx, oclMat &Dy,
867             int blockSize, int ksize, double k, int bordertype = cv::BORDER_DEFAULT);
868         CV_EXPORTS void cornerMinEigenVal(const oclMat &src, oclMat &dst, int blockSize, int ksize, int bordertype = cv::BORDER_DEFAULT);
869         CV_EXPORTS void cornerMinEigenVal_dxdy(const oclMat &src, oclMat &dst, oclMat &Dx, oclMat &Dy,
870             int blockSize, int ksize, int bordertype = cv::BORDER_DEFAULT);
871
872         /////////////////////////////////// ML ///////////////////////////////////////////
873
874         //! Compute closest centers for each lines in source and lable it after center's index
875         // supports CV_32FC1/CV_32FC2/CV_32FC4 data type
876         // supports NORM_L1 and NORM_L2 distType
877         // if indices is provided, only the indexed rows will be calculated and their results are in the same
878         // order of indices
879         CV_EXPORTS void distanceToCenters(oclMat &dists, oclMat &labels, const oclMat &src, const oclMat &centers, int distType = NORM_L2SQR, const oclMat &indices = oclMat());
880
881         //!Does k-means procedure on GPU
882         // supports CV_32FC1/CV_32FC2/CV_32FC4 data type
883         CV_EXPORTS double kmeans(const oclMat &src, int K, oclMat &bestLabels,
884                                      TermCriteria criteria, int attemps, int flags, oclMat &centers);
885
886
887         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
888         ///////////////////////////////////////////CascadeClassifier//////////////////////////////////////////////////////////////////
889         ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
890
891         class CV_EXPORTS_W OclCascadeClassifier : public  cv::CascadeClassifier
892         {
893         public:
894             OclCascadeClassifier() {};
895             ~OclCascadeClassifier() {};
896
897             CvSeq* oclHaarDetectObjects(oclMat &gimg, CvMemStorage *storage, double scaleFactor,
898                                         int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0));
899         };
900
901         class CV_EXPORTS OclCascadeClassifierBuf : public  cv::CascadeClassifier
902         {
903         public:
904             OclCascadeClassifierBuf() :
905                 m_flags(0), initialized(false), m_scaleFactor(0), buffers(NULL) {}
906
907             ~OclCascadeClassifierBuf() { release(); }
908
909             void detectMultiScale(oclMat &image, CV_OUT std::vector<cv::Rect>& faces,
910                                   double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0,
911                                   Size minSize = Size(), Size maxSize = Size());
912             void release();
913
914         private:
915             void Init(const int rows, const int cols, double scaleFactor, int flags,
916                       const int outputsz, const size_t localThreads[],
917                       CvSize minSize, CvSize maxSize);
918             void CreateBaseBufs(const int datasize, const int totalclassifier, const int flags, const int outputsz);
919             void CreateFactorRelatedBufs(const int rows, const int cols, const int flags,
920                                          const double scaleFactor, const size_t localThreads[],
921                                          CvSize minSize, CvSize maxSize);
922             void GenResult(CV_OUT std::vector<cv::Rect>& faces, const std::vector<cv::Rect> &rectList, const std::vector<int> &rweights);
923
924             int m_rows;
925             int m_cols;
926             int m_flags;
927             int m_loopcount;
928             int m_nodenum;
929             bool findBiggestObject;
930             bool initialized;
931             double m_scaleFactor;
932             Size m_minSize;
933             Size m_maxSize;
934             vector<CvSize> sizev;
935             vector<float> scalev;
936             oclMat gimg1, gsum, gsqsum;
937             void * buffers;
938         };
939
940
941         /////////////////////////////// Pyramid /////////////////////////////////////
942         CV_EXPORTS void pyrDown(const oclMat &src, oclMat &dst);
943
944         //! upsamples the source image and then smoothes it
945         CV_EXPORTS void pyrUp(const oclMat &src, oclMat &dst);
946
947         //! performs linear blending of two images
948         //! to avoid accuracy errors sum of weigths shouldn't be very close to zero
949         // supports only CV_8UC1 source type
950         CV_EXPORTS void blendLinear(const oclMat &img1, const oclMat &img2, const oclMat &weights1, const oclMat &weights2, oclMat &result);
951
952         //! computes vertical sum, supports only CV_32FC1 images
953         CV_EXPORTS void columnSum(const oclMat &src, oclMat &sum);
954
955         ///////////////////////////////////////// match_template /////////////////////////////////////////////////////////////
956         struct CV_EXPORTS MatchTemplateBuf
957         {
958             Size user_block_size;
959             oclMat imagef, templf;
960             std::vector<oclMat> images;
961             std::vector<oclMat> image_sums;
962             std::vector<oclMat> image_sqsums;
963         };
964
965         //! computes the proximity map for the raster template and the image where the template is searched for
966         // Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
967         // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
968         CV_EXPORTS void matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method);
969
970         //! computes the proximity map for the raster template and the image where the template is searched for
971         // Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
972         // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
973         CV_EXPORTS void matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method, MatchTemplateBuf &buf);
974
975         ///////////////////////////////////////////// Canny /////////////////////////////////////////////
976         struct CV_EXPORTS CannyBuf;
977         //! compute edges of the input image using Canny operator
978         // Support CV_8UC1 only
979         CV_EXPORTS void Canny(const oclMat &image, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false);
980         CV_EXPORTS void Canny(const oclMat &image, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false);
981         CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false);
982         CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false);
983
984         struct CV_EXPORTS CannyBuf
985         {
986             CannyBuf() : counter(1, 1, CV_32S) { }
987             ~CannyBuf()
988             {
989                 release();
990             }
991             explicit CannyBuf(const Size &image_size, int apperture_size = 3) : counter(1, 1, CV_32S)
992             {
993                 create(image_size, apperture_size);
994             }
995             CannyBuf(const oclMat &dx_, const oclMat &dy_);
996
997             void create(const Size &image_size, int apperture_size = 3);
998             void release();
999             oclMat dx, dy;
1000             oclMat dx_buf, dy_buf;
1001             oclMat edgeBuf;
1002             oclMat trackBuf1, trackBuf2;
1003             oclMat counter;
1004             Ptr<FilterEngine_GPU> filterDX, filterDY;
1005         };
1006
1007         ///////////////////////////////////////// clAmdFft related /////////////////////////////////////////
1008         //! Performs a forward or inverse discrete Fourier transform (1D or 2D) of floating point matrix.
1009         //! Param dft_size is the size of DFT transform.
1010         //!
1011         //! For complex-to-real transform it is assumed that the source matrix is packed in CLFFT's format.
1012         // support src type of CV32FC1, CV32FC2
1013         // support flags: DFT_INVERSE, DFT_REAL_OUTPUT, DFT_COMPLEX_OUTPUT, DFT_ROWS
1014         // dft_size is the size of original input, which is used for transformation from complex to real.
1015         // dft_size must be powers of 2, 3 and 5
1016         // real to complex dft requires at least v1.8 clAmdFft
1017         // real to complex dft output is not the same with cpu version
1018         // real to complex and complex to real does not support DFT_ROWS
1019         CV_EXPORTS void dft(const oclMat &src, oclMat &dst, Size dft_size = Size(), int flags = 0);
1020
1021         //! implements generalized matrix product algorithm GEMM from BLAS
1022         // The functionality requires clAmdBlas library
1023         // only support type CV_32FC1
1024         // flag GEMM_3_T is not supported
1025         CV_EXPORTS void gemm(const oclMat &src1, const oclMat &src2, double alpha,
1026                              const oclMat &src3, double beta, oclMat &dst, int flags = 0);
1027
1028         //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector //////////////
1029         struct CV_EXPORTS HOGDescriptor
1030         {
1031             enum { DEFAULT_WIN_SIGMA = -1 };
1032             enum { DEFAULT_NLEVELS = 64 };
1033             enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL };
1034             HOGDescriptor(Size win_size = Size(64, 128), Size block_size = Size(16, 16),
1035                           Size block_stride = Size(8, 8), Size cell_size = Size(8, 8),
1036                           int nbins = 9, double win_sigma = DEFAULT_WIN_SIGMA,
1037                           double threshold_L2hys = 0.2, bool gamma_correction = true,
1038                           int nlevels = DEFAULT_NLEVELS);
1039
1040             size_t getDescriptorSize() const;
1041             size_t getBlockHistogramSize() const;
1042             void setSVMDetector(const vector<float> &detector);
1043             static vector<float> getDefaultPeopleDetector();
1044             static vector<float> getPeopleDetector48x96();
1045             static vector<float> getPeopleDetector64x128();
1046             void detect(const oclMat &img, vector<Point> &found_locations,
1047                         double hit_threshold = 0, Size win_stride = Size(),
1048                         Size padding = Size());
1049             void detectMultiScale(const oclMat &img, vector<Rect> &found_locations,
1050                                   double hit_threshold = 0, Size win_stride = Size(),
1051                                   Size padding = Size(), double scale0 = 1.05,
1052                                   int group_threshold = 2);
1053             void getDescriptors(const oclMat &img, Size win_stride,
1054                                 oclMat &descriptors,
1055                                 int descr_format = DESCR_FORMAT_COL_BY_COL);
1056             Size win_size;
1057             Size block_size;
1058             Size block_stride;
1059             Size cell_size;
1060
1061             int nbins;
1062             double win_sigma;
1063             double threshold_L2hys;
1064             bool gamma_correction;
1065             int nlevels;
1066
1067         protected:
1068             // initialize buffers; only need to do once in case of multiscale detection
1069             void init_buffer(const oclMat &img, Size win_stride);
1070             void computeBlockHistograms(const oclMat &img);
1071             void computeGradient(const oclMat &img, oclMat &grad, oclMat &qangle);
1072             double getWinSigma() const;
1073             bool checkDetectorSize() const;
1074
1075             static int numPartsWithin(int size, int part_size, int stride);
1076             static Size numPartsWithin(Size size, Size part_size, Size stride);
1077
1078             // Coefficients of the separating plane
1079             float free_coef;
1080             oclMat detector;
1081             // Results of the last classification step
1082             oclMat labels;
1083             Mat labels_host;
1084             // Results of the last histogram evaluation step
1085             oclMat block_hists;
1086             // Gradients conputation results
1087             oclMat grad, qangle;
1088             // scaled image
1089             oclMat image_scale;
1090             // effect size of input image (might be different from original size after scaling)
1091             Size effect_size;
1092         };
1093
1094
1095         ////////////////////////feature2d_ocl/////////////////
1096         /****************************************************************************************\
1097         *                                      Distance                                          *
1098         \****************************************************************************************/
1099         template<typename T>
1100         struct CV_EXPORTS Accumulator
1101         {
1102             typedef T Type;
1103         };
1104         template<> struct Accumulator<unsigned char>
1105         {
1106             typedef float Type;
1107         };
1108         template<> struct Accumulator<unsigned short>
1109         {
1110             typedef float Type;
1111         };
1112         template<> struct Accumulator<char>
1113         {
1114             typedef float Type;
1115         };
1116         template<> struct Accumulator<short>
1117         {
1118             typedef float Type;
1119         };
1120
1121         /*
1122          * Manhattan distance (city block distance) functor
1123          */
1124         template<class T>
1125         struct CV_EXPORTS L1
1126         {
1127             enum { normType = NORM_L1 };
1128             typedef T ValueType;
1129             typedef typename Accumulator<T>::Type ResultType;
1130
1131             ResultType operator()( const T *a, const T *b, int size ) const
1132             {
1133                 return normL1<ValueType, ResultType>(a, b, size);
1134             }
1135         };
1136
1137         /*
1138          * Euclidean distance functor
1139          */
1140         template<class T>
1141         struct CV_EXPORTS L2
1142         {
1143             enum { normType = NORM_L2 };
1144             typedef T ValueType;
1145             typedef typename Accumulator<T>::Type ResultType;
1146
1147             ResultType operator()( const T *a, const T *b, int size ) const
1148             {
1149                 return (ResultType)sqrt((double)normL2Sqr<ValueType, ResultType>(a, b, size));
1150             }
1151         };
1152
1153         /*
1154          * Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor
1155          * bit count of A exclusive XOR'ed with B
1156          */
1157         struct CV_EXPORTS Hamming
1158         {
1159             enum { normType = NORM_HAMMING };
1160             typedef unsigned char ValueType;
1161             typedef int ResultType;
1162
1163             /** this will count the bits in a ^ b
1164              */
1165             ResultType operator()( const unsigned char *a, const unsigned char *b, int size ) const
1166             {
1167                 return normHamming(a, b, size);
1168             }
1169         };
1170
1171         ////////////////////////////////// BruteForceMatcher //////////////////////////////////
1172
1173         class CV_EXPORTS BruteForceMatcher_OCL_base
1174         {
1175         public:
1176             enum DistType {L1Dist = 0, L2Dist, HammingDist};
1177             explicit BruteForceMatcher_OCL_base(DistType distType = L2Dist);
1178             // Add descriptors to train descriptor collection
1179             void add(const std::vector<oclMat> &descCollection);
1180             // Get train descriptors collection
1181             const std::vector<oclMat> &getTrainDescriptors() const;
1182             // Clear train descriptors collection
1183             void clear();
1184             // Return true if there are not train descriptors in collection
1185             bool empty() const;
1186
1187             // Return true if the matcher supports mask in match methods
1188             bool isMaskSupported() const;
1189
1190             // Find one best match for each query descriptor
1191             void matchSingle(const oclMat &query, const oclMat &train,
1192                              oclMat &trainIdx, oclMat &distance,
1193                              const oclMat &mask = oclMat());
1194
1195             // Download trainIdx and distance and convert it to CPU vector with DMatch
1196             static void matchDownload(const oclMat &trainIdx, const oclMat &distance, std::vector<DMatch> &matches);
1197             // Convert trainIdx and distance to vector with DMatch
1198             static void matchConvert(const Mat &trainIdx, const Mat &distance, std::vector<DMatch> &matches);
1199
1200             // Find one best match for each query descriptor
1201             void match(const oclMat &query, const oclMat &train, std::vector<DMatch> &matches, const oclMat &mask = oclMat());
1202
1203             // Make gpu collection of trains and masks in suitable format for matchCollection function
1204             void makeGpuCollection(oclMat &trainCollection, oclMat &maskCollection, const std::vector<oclMat> &masks = std::vector<oclMat>());
1205
1206
1207             // Find one best match from train collection for each query descriptor
1208             void matchCollection(const oclMat &query, const oclMat &trainCollection,
1209                                  oclMat &trainIdx, oclMat &imgIdx, oclMat &distance,
1210                                  const oclMat &masks = oclMat());
1211
1212             // Download trainIdx, imgIdx and distance and convert it to vector with DMatch
1213             static void matchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, std::vector<DMatch> &matches);
1214             // Convert trainIdx, imgIdx and distance to vector with DMatch
1215             static void matchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, std::vector<DMatch> &matches);
1216
1217             // Find one best match from train collection for each query descriptor.
1218             void match(const oclMat &query, std::vector<DMatch> &matches, const std::vector<oclMat> &masks = std::vector<oclMat>());
1219
1220             // Find k best matches for each query descriptor (in increasing order of distances)
1221             void knnMatchSingle(const oclMat &query, const oclMat &train,
1222                                 oclMat &trainIdx, oclMat &distance, oclMat &allDist, int k,
1223                                 const oclMat &mask = oclMat());
1224
1225             // Download trainIdx and distance and convert it to vector with DMatch
1226             // compactResult is used when mask is not empty. If compactResult is false matches
1227             // vector will have the same size as queryDescriptors rows. If compactResult is true
1228             // matches vector will not contain matches for fully masked out query descriptors.
1229             static void knnMatchDownload(const oclMat &trainIdx, const oclMat &distance,
1230                                          std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1231
1232             // Convert trainIdx and distance to vector with DMatch
1233             static void knnMatchConvert(const Mat &trainIdx, const Mat &distance,
1234                                         std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1235
1236             // Find k best matches for each query descriptor (in increasing order of distances).
1237             // compactResult is used when mask is not empty. If compactResult is false matches
1238             // vector will have the same size as queryDescriptors rows. If compactResult is true
1239             // matches vector will not contain matches for fully masked out query descriptors.
1240             void knnMatch(const oclMat &query, const oclMat &train,
1241                           std::vector< std::vector<DMatch> > &matches, int k, const oclMat &mask = oclMat(),
1242                           bool compactResult = false);
1243
1244             // Find k best matches from train collection for each query descriptor (in increasing order of distances)
1245             void knnMatch2Collection(const oclMat &query, const oclMat &trainCollection,
1246                                      oclMat &trainIdx, oclMat &imgIdx, oclMat &distance,
1247                                      const oclMat &maskCollection = oclMat());
1248
1249             // Download trainIdx and distance and convert it to vector with DMatch
1250             // compactResult is used when mask is not empty. If compactResult is false matches
1251             // vector will have the same size as queryDescriptors rows. If compactResult is true
1252             // matches vector will not contain matches for fully masked out query descriptors.
1253             static void knnMatch2Download(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance,
1254                                           std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1255
1256             // Convert trainIdx and distance to vector with DMatch
1257             static void knnMatch2Convert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance,
1258                                          std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1259
1260             // Find k best matches  for each query descriptor (in increasing order of distances).
1261             // compactResult is used when mask is not empty. If compactResult is false matches
1262             // vector will have the same size as queryDescriptors rows. If compactResult is true
1263             // matches vector will not contain matches for fully masked out query descriptors.
1264             void knnMatch(const oclMat &query, std::vector< std::vector<DMatch> > &matches, int k,
1265                           const std::vector<oclMat> &masks = std::vector<oclMat>(), bool compactResult = false);
1266
1267             // Find best matches for each query descriptor which have distance less than maxDistance.
1268             // nMatches.at<int>(0, queryIdx) will contain matches count for queryIdx.
1269             // carefully nMatches can be greater than trainIdx.cols - it means that matcher didn't find all matches,
1270             // because it didn't have enough memory.
1271             // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nTrain / 100), 10),
1272             // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
1273             // Matches doesn't sorted.
1274             void radiusMatchSingle(const oclMat &query, const oclMat &train,
1275                                    oclMat &trainIdx, oclMat &distance, oclMat &nMatches, float maxDistance,
1276                                    const oclMat &mask = oclMat());
1277
1278             // Download trainIdx, nMatches and distance and convert it to vector with DMatch.
1279             // matches will be sorted in increasing order of distances.
1280             // compactResult is used when mask is not empty. If compactResult is false matches
1281             // vector will have the same size as queryDescriptors rows. If compactResult is true
1282             // matches vector will not contain matches for fully masked out query descriptors.
1283             static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches,
1284                                             std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1285             // Convert trainIdx, nMatches and distance to vector with DMatch.
1286             static void radiusMatchConvert(const Mat &trainIdx, const Mat &distance, const Mat &nMatches,
1287                                            std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1288             // Find best matches for each query descriptor which have distance less than maxDistance
1289             // in increasing order of distances).
1290             void radiusMatch(const oclMat &query, const oclMat &train,
1291                              std::vector< std::vector<DMatch> > &matches, float maxDistance,
1292                              const oclMat &mask = oclMat(), bool compactResult = false);
1293             // Find best matches for each query descriptor which have distance less than maxDistance.
1294             // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nQuery / 100), 10),
1295             // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
1296             // Matches doesn't sorted.
1297             void radiusMatchCollection(const oclMat &query, oclMat &trainIdx, oclMat &imgIdx, oclMat &distance, oclMat &nMatches, float maxDistance,
1298                                        const std::vector<oclMat> &masks = std::vector<oclMat>());
1299             // Download trainIdx, imgIdx, nMatches and distance and convert it to vector with DMatch.
1300             // matches will be sorted in increasing order of distances.
1301             // compactResult is used when mask is not empty. If compactResult is false matches
1302             // vector will have the same size as queryDescriptors rows. If compactResult is true
1303             // matches vector will not contain matches for fully masked out query descriptors.
1304             static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, const oclMat &nMatches,
1305                                             std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1306             // Convert trainIdx, nMatches and distance to vector with DMatch.
1307             static void radiusMatchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, const Mat &nMatches,
1308                                            std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1309             // Find best matches from train collection for each query descriptor which have distance less than
1310             // maxDistance (in increasing order of distances).
1311             void radiusMatch(const oclMat &query, std::vector< std::vector<DMatch> > &matches, float maxDistance,
1312                              const std::vector<oclMat> &masks = std::vector<oclMat>(), bool compactResult = false);
1313             DistType distType;
1314         private:
1315             std::vector<oclMat> trainDescCollection;
1316         };
1317
1318         template <class Distance>
1319         class CV_EXPORTS BruteForceMatcher_OCL;
1320
1321         template <typename T>
1322         class CV_EXPORTS BruteForceMatcher_OCL< L1<T> > : public BruteForceMatcher_OCL_base
1323         {
1324         public:
1325             explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L1Dist) {}
1326             explicit BruteForceMatcher_OCL(L1<T> /*d*/) : BruteForceMatcher_OCL_base(L1Dist) {}
1327         };
1328
1329         template <typename T>
1330         class CV_EXPORTS BruteForceMatcher_OCL< L2<T> > : public BruteForceMatcher_OCL_base
1331         {
1332         public:
1333             explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L2Dist) {}
1334             explicit BruteForceMatcher_OCL(L2<T> /*d*/) : BruteForceMatcher_OCL_base(L2Dist) {}
1335         };
1336
1337         template <> class CV_EXPORTS BruteForceMatcher_OCL< Hamming > : public BruteForceMatcher_OCL_base
1338         {
1339         public:
1340             explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(HammingDist) {}
1341             explicit BruteForceMatcher_OCL(Hamming /*d*/) : BruteForceMatcher_OCL_base(HammingDist) {}
1342         };
1343
1344         class CV_EXPORTS BFMatcher_OCL : public BruteForceMatcher_OCL_base
1345         {
1346         public:
1347             explicit BFMatcher_OCL(int norm = NORM_L2) : BruteForceMatcher_OCL_base(norm == NORM_L1 ? L1Dist : norm == NORM_L2 ? L2Dist : HammingDist) {}
1348         };
1349
1350         class CV_EXPORTS GoodFeaturesToTrackDetector_OCL
1351         {
1352         public:
1353             explicit GoodFeaturesToTrackDetector_OCL(int maxCorners = 1000, double qualityLevel = 0.01, double minDistance = 0.0,
1354                 int blockSize = 3, bool useHarrisDetector = false, double harrisK = 0.04);
1355
1356             //! return 1 rows matrix with CV_32FC2 type
1357             void operator ()(const oclMat& image, oclMat& corners, const oclMat& mask = oclMat());
1358             //! download points of type Point2f to a vector. the vector's content will be erased
1359             void downloadPoints(const oclMat &points, vector<Point2f> &points_v);
1360
1361             int maxCorners;
1362             double qualityLevel;
1363             double minDistance;
1364
1365             int blockSize;
1366             bool useHarrisDetector;
1367             double harrisK;
1368             void releaseMemory()
1369             {
1370                 Dx_.release();
1371                 Dy_.release();
1372                 eig_.release();
1373                 minMaxbuf_.release();
1374                 tmpCorners_.release();
1375             }
1376         private:
1377             oclMat Dx_;
1378             oclMat Dy_;
1379             oclMat eig_;
1380             oclMat minMaxbuf_;
1381             oclMat tmpCorners_;
1382         };
1383
1384         inline GoodFeaturesToTrackDetector_OCL::GoodFeaturesToTrackDetector_OCL(int maxCorners_, double qualityLevel_, double minDistance_,
1385             int blockSize_, bool useHarrisDetector_, double harrisK_)
1386         {
1387             maxCorners = maxCorners_;
1388             qualityLevel = qualityLevel_;
1389             minDistance = minDistance_;
1390             blockSize = blockSize_;
1391             useHarrisDetector = useHarrisDetector_;
1392             harrisK = harrisK_;
1393         }
1394
1395         /////////////////////////////// PyrLKOpticalFlow /////////////////////////////////////
1396         class CV_EXPORTS PyrLKOpticalFlow
1397         {
1398         public:
1399             PyrLKOpticalFlow()
1400             {
1401                 winSize = Size(21, 21);
1402                 maxLevel = 3;
1403                 iters = 30;
1404                 derivLambda = 0.5;
1405                 useInitialFlow = false;
1406                 minEigThreshold = 1e-4f;
1407                 getMinEigenVals = false;
1408                 isDeviceArch11_ = false;
1409             }
1410
1411             void sparse(const oclMat &prevImg, const oclMat &nextImg, const oclMat &prevPts, oclMat &nextPts,
1412                         oclMat &status, oclMat *err = 0);
1413             void dense(const oclMat &prevImg, const oclMat &nextImg, oclMat &u, oclMat &v, oclMat *err = 0);
1414             Size winSize;
1415             int maxLevel;
1416             int iters;
1417             double derivLambda;
1418             bool useInitialFlow;
1419             float minEigThreshold;
1420             bool getMinEigenVals;
1421             void releaseMemory()
1422             {
1423                 dx_calcBuf_.release();
1424                 dy_calcBuf_.release();
1425
1426                 prevPyr_.clear();
1427                 nextPyr_.clear();
1428
1429                 dx_buf_.release();
1430                 dy_buf_.release();
1431             }
1432         private:
1433             void calcSharrDeriv(const oclMat &src, oclMat &dx, oclMat &dy);
1434             void buildImagePyramid(const oclMat &img0, vector<oclMat> &pyr, bool withBorder);
1435
1436             oclMat dx_calcBuf_;
1437             oclMat dy_calcBuf_;
1438
1439             vector<oclMat> prevPyr_;
1440             vector<oclMat> nextPyr_;
1441
1442             oclMat dx_buf_;
1443             oclMat dy_buf_;
1444             oclMat uPyr_[2];
1445             oclMat vPyr_[2];
1446             bool isDeviceArch11_;
1447         };
1448
1449         class CV_EXPORTS FarnebackOpticalFlow
1450         {
1451         public:
1452             FarnebackOpticalFlow();
1453
1454             int numLevels;
1455             double pyrScale;
1456             bool fastPyramids;
1457             int winSize;
1458             int numIters;
1459             int polyN;
1460             double polySigma;
1461             int flags;
1462
1463             void operator ()(const oclMat &frame0, const oclMat &frame1, oclMat &flowx, oclMat &flowy);
1464
1465             void releaseMemory();
1466
1467         private:
1468             void prepareGaussian(
1469                 int n, double sigma, float *g, float *xg, float *xxg,
1470                 double &ig11, double &ig03, double &ig33, double &ig55);
1471
1472             void setPolynomialExpansionConsts(int n, double sigma);
1473
1474             void updateFlow_boxFilter(
1475                 const oclMat& R0, const oclMat& R1, oclMat& flowx, oclMat &flowy,
1476                 oclMat& M, oclMat &bufM, int blockSize, bool updateMatrices);
1477
1478             void updateFlow_gaussianBlur(
1479                 const oclMat& R0, const oclMat& R1, oclMat& flowx, oclMat& flowy,
1480                 oclMat& M, oclMat &bufM, int blockSize, bool updateMatrices);
1481
1482             oclMat frames_[2];
1483             oclMat pyrLevel_[2], M_, bufM_, R_[2], blurredFrame_[2];
1484             std::vector<oclMat> pyramid0_, pyramid1_;
1485         };
1486
1487         //////////////// build warping maps ////////////////////
1488         //! builds plane warping maps
1489         CV_EXPORTS void buildWarpPlaneMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, const Mat &T, float scale, oclMat &map_x, oclMat &map_y);
1490         //! builds cylindrical warping maps
1491         CV_EXPORTS void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale, oclMat &map_x, oclMat &map_y);
1492         //! builds spherical warping maps
1493         CV_EXPORTS void buildWarpSphericalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale, oclMat &map_x, oclMat &map_y);
1494         //! builds Affine warping maps
1495         CV_EXPORTS void buildWarpAffineMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap);
1496
1497         //! builds Perspective warping maps
1498         CV_EXPORTS void buildWarpPerspectiveMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap);
1499
1500         ///////////////////////////////////// interpolate frames //////////////////////////////////////////////
1501         //! Interpolate frames (images) using provided optical flow (displacement field).
1502         //! frame0   - frame 0 (32-bit floating point images, single channel)
1503         //! frame1   - frame 1 (the same type and size)
1504         //! fu       - forward horizontal displacement
1505         //! fv       - forward vertical displacement
1506         //! bu       - backward horizontal displacement
1507         //! bv       - backward vertical displacement
1508         //! pos      - new frame position
1509         //! newFrame - new frame
1510         //! buf      - temporary buffer, will have width x 6*height size, CV_32FC1 type and contain 6 oclMat;
1511         //!            occlusion masks            0, occlusion masks            1,
1512         //!            interpolated forward flow  0, interpolated forward flow  1,
1513         //!            interpolated backward flow 0, interpolated backward flow 1
1514         //!
1515         CV_EXPORTS void interpolateFrames(const oclMat &frame0, const oclMat &frame1,
1516                                           const oclMat &fu, const oclMat &fv,
1517                                           const oclMat &bu, const oclMat &bv,
1518                                           float pos, oclMat &newFrame, oclMat &buf);
1519
1520         //! computes moments of the rasterized shape or a vector of points
1521         //! _array should be a vector a points standing for the contour
1522         CV_EXPORTS Moments ocl_moments(InputArray contour);
1523         //! src should be a general image uploaded to the GPU.
1524         //! the supported oclMat type are CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1 and CV_64FC1
1525         //! to use type of CV_64FC1, the GPU should support CV_64FC1
1526         CV_EXPORTS Moments ocl_moments(oclMat& src, bool binary);
1527
1528         class CV_EXPORTS StereoBM_OCL
1529         {
1530         public:
1531             enum { BASIC_PRESET = 0, PREFILTER_XSOBEL = 1 };
1532
1533             enum { DEFAULT_NDISP = 64, DEFAULT_WINSZ = 19 };
1534
1535             //! the default constructor
1536             StereoBM_OCL();
1537             //! the full constructor taking the camera-specific preset, number of disparities and the SAD window size. ndisparities must be multiple of 8.
1538             StereoBM_OCL(int preset, int ndisparities = DEFAULT_NDISP, int winSize = DEFAULT_WINSZ);
1539
1540             //! the stereo correspondence operator. Finds the disparity for the specified rectified stereo pair
1541             //! Output disparity has CV_8U type.
1542             void operator() ( const oclMat &left, const oclMat &right, oclMat &disparity);
1543
1544             //! Some heuristics that tries to estmate
1545             // if current GPU will be faster then CPU in this algorithm.
1546             // It queries current active device.
1547             static bool checkIfGpuCallReasonable();
1548
1549             int preset;
1550             int ndisp;
1551             int winSize;
1552
1553             // If avergeTexThreshold  == 0 => post procesing is disabled
1554             // If avergeTexThreshold != 0 then disparity is set 0 in each point (x,y) where for left image
1555             // SumOfHorizontalGradiensInWindow(x, y, winSize) < (winSize * winSize) * avergeTexThreshold
1556             // i.e. input left image is low textured.
1557             float avergeTexThreshold;
1558         private:
1559             oclMat minSSD, leBuf, riBuf;
1560         };
1561
1562         class CV_EXPORTS StereoBeliefPropagation
1563         {
1564         public:
1565             enum { DEFAULT_NDISP  = 64 };
1566             enum { DEFAULT_ITERS  = 5  };
1567             enum { DEFAULT_LEVELS = 5  };
1568             static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels);
1569             explicit StereoBeliefPropagation(int ndisp  = DEFAULT_NDISP,
1570                                              int iters  = DEFAULT_ITERS,
1571                                              int levels = DEFAULT_LEVELS,
1572                                              int msg_type = CV_16S);
1573             StereoBeliefPropagation(int ndisp, int iters, int levels,
1574                                     float max_data_term, float data_weight,
1575                                     float max_disc_term, float disc_single_jump,
1576                                     int msg_type = CV_32F);
1577             void operator()(const oclMat &left, const oclMat &right, oclMat &disparity);
1578             void operator()(const oclMat &data, oclMat &disparity);
1579             int ndisp;
1580             int iters;
1581             int levels;
1582             float max_data_term;
1583             float data_weight;
1584             float max_disc_term;
1585             float disc_single_jump;
1586             int msg_type;
1587         private:
1588             oclMat u, d, l, r, u2, d2, l2, r2;
1589             std::vector<oclMat> datas;
1590             oclMat out;
1591         };
1592
1593         class CV_EXPORTS StereoConstantSpaceBP
1594         {
1595         public:
1596             enum { DEFAULT_NDISP    = 128 };
1597             enum { DEFAULT_ITERS    = 8   };
1598             enum { DEFAULT_LEVELS   = 4   };
1599             enum { DEFAULT_NR_PLANE = 4   };
1600             static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels, int &nr_plane);
1601             explicit StereoConstantSpaceBP(
1602                 int ndisp    = DEFAULT_NDISP,
1603                 int iters    = DEFAULT_ITERS,
1604                 int levels   = DEFAULT_LEVELS,
1605                 int nr_plane = DEFAULT_NR_PLANE,
1606                 int msg_type = CV_32F);
1607             StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane,
1608                 float max_data_term, float data_weight, float max_disc_term, float disc_single_jump,
1609                 int min_disp_th = 0,
1610                 int msg_type = CV_32F);
1611             void operator()(const oclMat &left, const oclMat &right, oclMat &disparity);
1612             int ndisp;
1613             int iters;
1614             int levels;
1615             int nr_plane;
1616             float max_data_term;
1617             float data_weight;
1618             float max_disc_term;
1619             float disc_single_jump;
1620             int min_disp_th;
1621             int msg_type;
1622             bool use_local_init_data_cost;
1623         private:
1624             oclMat u[2], d[2], l[2], r[2];
1625             oclMat disp_selected_pyr[2];
1626             oclMat data_cost;
1627             oclMat data_cost_selected;
1628             oclMat temp;
1629             oclMat out;
1630         };
1631
1632         // Implementation of the Zach, Pock and Bischof Dual TV-L1 Optical Flow method
1633         //
1634         // see reference:
1635         //   [1] C. Zach, T. Pock and H. Bischof, "A Duality Based Approach for Realtime TV-L1 Optical Flow".
1636         //   [2] Javier Sanchez, Enric Meinhardt-Llopis and Gabriele Facciolo. "TV-L1 Optical Flow Estimation".
1637         class CV_EXPORTS OpticalFlowDual_TVL1_OCL
1638         {
1639         public:
1640             OpticalFlowDual_TVL1_OCL();
1641
1642             void operator ()(const oclMat& I0, const oclMat& I1, oclMat& flowx, oclMat& flowy);
1643
1644             void collectGarbage();
1645
1646             /**
1647             * Time step of the numerical scheme.
1648             */
1649             double tau;
1650
1651             /**
1652             * Weight parameter for the data term, attachment parameter.
1653             * This is the most relevant parameter, which determines the smoothness of the output.
1654             * The smaller this parameter is, the smoother the solutions we obtain.
1655             * It depends on the range of motions of the images, so its value should be adapted to each image sequence.
1656             */
1657             double lambda;
1658
1659             /**
1660             * Weight parameter for (u - v)^2, tightness parameter.
1661             * It serves as a link between the attachment and the regularization terms.
1662             * In theory, it should have a small value in order to maintain both parts in correspondence.
1663             * The method is stable for a large range of values of this parameter.
1664             */
1665             double theta;
1666
1667             /**
1668             * Number of scales used to create the pyramid of images.
1669             */
1670             int nscales;
1671
1672             /**
1673             * Number of warpings per scale.
1674             * Represents the number of times that I1(x+u0) and grad( I1(x+u0) ) are computed per scale.
1675             * This is a parameter that assures the stability of the method.
1676             * It also affects the running time, so it is a compromise between speed and accuracy.
1677             */
1678             int warps;
1679
1680             /**
1681             * Stopping criterion threshold used in the numerical scheme, which is a trade-off between precision and running time.
1682             * A small value will yield more accurate solutions at the expense of a slower convergence.
1683             */
1684             double epsilon;
1685
1686             /**
1687             * Stopping criterion iterations number used in the numerical scheme.
1688             */
1689             int iterations;
1690
1691             bool useInitialFlow;
1692
1693         private:
1694             void procOneScale(const oclMat& I0, const oclMat& I1, oclMat& u1, oclMat& u2);
1695
1696             std::vector<oclMat> I0s;
1697             std::vector<oclMat> I1s;
1698             std::vector<oclMat> u1s;
1699             std::vector<oclMat> u2s;
1700
1701             oclMat I1x_buf;
1702             oclMat I1y_buf;
1703
1704             oclMat I1w_buf;
1705             oclMat I1wx_buf;
1706             oclMat I1wy_buf;
1707
1708             oclMat grad_buf;
1709             oclMat rho_c_buf;
1710
1711             oclMat p11_buf;
1712             oclMat p12_buf;
1713             oclMat p21_buf;
1714             oclMat p22_buf;
1715
1716             oclMat diff_buf;
1717             oclMat norm_buf;
1718         };
1719         // current supported sorting methods
1720         enum
1721         {
1722             SORT_BITONIC,   // only support power-of-2 buffer size
1723             SORT_SELECTION, // cannot sort duplicate keys
1724             SORT_MERGE,
1725             SORT_RADIX      // only support signed int/float keys(CV_32S/CV_32F)
1726         };
1727         //! Returns the sorted result of all the elements in input based on equivalent keys.
1728         //
1729         //  The element unit in the values to be sorted is determined from the data type,
1730         //  i.e., a CV_32FC2 input {a1a2, b1b2} will be considered as two elements, regardless its
1731         //  matrix dimension.
1732         //  both keys and values will be sorted inplace
1733         //  Key needs to be single channel oclMat.
1734         //
1735         //  Example:
1736         //  input -
1737         //    keys   = {2,    3,   1}   (CV_8UC1)
1738         //    values = {10,5, 4,3, 6,2} (CV_8UC2)
1739         //  sortByKey(keys, values, SORT_SELECTION, false);
1740         //  output -
1741         //    keys   = {1,    2,   3}   (CV_8UC1)
1742         //    values = {6,2, 10,5, 4,3} (CV_8UC2)
1743         CV_EXPORTS void sortByKey(oclMat& keys, oclMat& values, int method, bool isGreaterThan = false);
1744         /*!Base class for MOG and MOG2!*/
1745         class CV_EXPORTS BackgroundSubtractor
1746         {
1747         public:
1748             //! the virtual destructor
1749             virtual ~BackgroundSubtractor();
1750             //! the update operator that takes the next video frame and returns the current foreground mask as 8-bit binary image.
1751             virtual void operator()(const oclMat& image, oclMat& fgmask, float learningRate);
1752
1753             //! computes a background image
1754             virtual void getBackgroundImage(oclMat& backgroundImage) const = 0;
1755         };
1756                 /*!
1757         Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm
1758
1759         The class implements the following algorithm:
1760         "An improved adaptive background mixture model for real-time tracking with shadow detection"
1761         P. KadewTraKuPong and R. Bowden,
1762         Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001."
1763         http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
1764         */
1765         class CV_EXPORTS MOG: public cv::ocl::BackgroundSubtractor
1766         {
1767         public:
1768             //! the default constructor
1769             MOG(int nmixtures = -1);
1770
1771             //! re-initiaization method
1772             void initialize(Size frameSize, int frameType);
1773
1774             //! the update operator
1775             void operator()(const oclMat& frame, oclMat& fgmask, float learningRate = 0.f);
1776
1777             //! computes a background image which are the mean of all background gaussians
1778             void getBackgroundImage(oclMat& backgroundImage) const;
1779
1780             //! releases all inner buffers
1781             void release();
1782
1783             int history;
1784             float varThreshold;
1785             float backgroundRatio;
1786             float noiseSigma;
1787
1788         private:
1789             int nmixtures_;
1790
1791             Size frameSize_;
1792             int frameType_;
1793             int nframes_;
1794
1795             oclMat weight_;
1796             oclMat sortKey_;
1797             oclMat mean_;
1798             oclMat var_;
1799         };
1800
1801         /*!
1802         The class implements the following algorithm:
1803         "Improved adaptive Gausian mixture model for background subtraction"
1804         Z.Zivkovic
1805         International Conference Pattern Recognition, UK, August, 2004.
1806         http://www.zoranz.net/Publications/zivkovic2004ICPR.pdf
1807         */
1808         class CV_EXPORTS MOG2: public cv::ocl::BackgroundSubtractor
1809         {
1810         public:
1811             //! the default constructor
1812             MOG2(int nmixtures = -1);
1813
1814             //! re-initiaization method
1815             void initialize(Size frameSize, int frameType);
1816
1817             //! the update operator
1818             void operator()(const oclMat& frame, oclMat& fgmask, float learningRate = -1.0f);
1819
1820             //! computes a background image which are the mean of all background gaussians
1821             void getBackgroundImage(oclMat& backgroundImage) const;
1822
1823             //! releases all inner buffers
1824             void release();
1825
1826             // parameters
1827             // you should call initialize after parameters changes
1828
1829             int history;
1830
1831             //! here it is the maximum allowed number of mixture components.
1832             //! Actual number is determined dynamically per pixel
1833             float varThreshold;
1834             // threshold on the squared Mahalanobis distance to decide if it is well described
1835             // by the background model or not. Related to Cthr from the paper.
1836             // This does not influence the update of the background. A typical value could be 4 sigma
1837             // and that is varThreshold=4*4=16; Corresponds to Tb in the paper.
1838
1839             /////////////////////////
1840             // less important parameters - things you might change but be carefull
1841             ////////////////////////
1842
1843             float backgroundRatio;
1844             // corresponds to fTB=1-cf from the paper
1845             // TB - threshold when the component becomes significant enough to be included into
1846             // the background model. It is the TB=1-cf from the paper. So I use cf=0.1 => TB=0.
1847             // For alpha=0.001 it means that the mode should exist for approximately 105 frames before
1848             // it is considered foreground
1849             // float noiseSigma;
1850             float varThresholdGen;
1851
1852             //correspondts to Tg - threshold on the squared Mahalan. dist. to decide
1853             //when a sample is close to the existing components. If it is not close
1854             //to any a new component will be generated. I use 3 sigma => Tg=3*3=9.
1855             //Smaller Tg leads to more generated components and higher Tg might make
1856             //lead to small number of components but they can grow too large
1857             float fVarInit;
1858             float fVarMin;
1859             float fVarMax;
1860
1861             //initial variance  for the newly generated components.
1862             //It will will influence the speed of adaptation. A good guess should be made.
1863             //A simple way is to estimate the typical standard deviation from the images.
1864             //I used here 10 as a reasonable value
1865             // min and max can be used to further control the variance
1866             float fCT; //CT - complexity reduction prior
1867             //this is related to the number of samples needed to accept that a component
1868             //actually exists. We use CT=0.05 of all the samples. By setting CT=0 you get
1869             //the standard Stauffer&Grimson algorithm (maybe not exact but very similar)
1870
1871             //shadow detection parameters
1872             bool bShadowDetection; //default 1 - do shadow detection
1873             unsigned char nShadowDetection; //do shadow detection - insert this value as the detection result - 127 default value
1874             float fTau;
1875             // Tau - shadow threshold. The shadow is detected if the pixel is darker
1876             //version of the background. Tau is a threshold on how much darker the shadow can be.
1877             //Tau= 0.5 means that if pixel is more than 2 times darker then it is not shadow
1878             //See: Prati,Mikic,Trivedi,Cucchiarra,"Detecting Moving Shadows...",IEEE PAMI,2003.
1879
1880         private:
1881             int nmixtures_;
1882
1883             Size frameSize_;
1884             int frameType_;
1885             int nframes_;
1886
1887             oclMat weight_;
1888             oclMat variance_;
1889             oclMat mean_;
1890
1891             oclMat bgmodelUsedModes_; //keep track of number of modes per pixel
1892         };
1893
1894         /*!***************Kalman Filter*************!*/
1895         class CV_EXPORTS KalmanFilter
1896         {
1897         public:
1898             KalmanFilter();
1899             //! the full constructor taking the dimensionality of the state, of the measurement and of the control vector
1900             KalmanFilter(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F);
1901             //! re-initializes Kalman filter. The previous content is destroyed.
1902             void init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F);
1903
1904             const oclMat& predict(const oclMat& control=oclMat());
1905             const oclMat& correct(const oclMat& measurement);
1906
1907             oclMat statePre;           //!< predicted state (x'(k)): x(k)=A*x(k-1)+B*u(k)
1908             oclMat statePost;          //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k))
1909             oclMat transitionMatrix;   //!< state transition matrix (A)
1910             oclMat controlMatrix;      //!< control matrix (B) (not used if there is no control)
1911             oclMat measurementMatrix;  //!< measurement matrix (H)
1912             oclMat processNoiseCov;    //!< process noise covariance matrix (Q)
1913             oclMat measurementNoiseCov;//!< measurement noise covariance matrix (R)
1914             oclMat errorCovPre;        //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/
1915             oclMat gain;               //!< Kalman gain matrix (K(k)): K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)
1916             oclMat errorCovPost;       //!< posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k)
1917         private:
1918             oclMat temp1;
1919             oclMat temp2;
1920             oclMat temp3;
1921             oclMat temp4;
1922             oclMat temp5;
1923         };
1924
1925         /*!***************K Nearest Neighbour*************!*/
1926         class CV_EXPORTS KNearestNeighbour: public CvKNearest
1927         {
1928         public:
1929             KNearestNeighbour();
1930             ~KNearestNeighbour();
1931
1932             bool train(const Mat& trainData, Mat& labels, Mat& sampleIdx = Mat().setTo(Scalar::all(0)),
1933                 bool isRegression = false, int max_k = 32, bool updateBase = false);
1934
1935             void clear();
1936
1937             void find_nearest(const oclMat& samples, int k, oclMat& lables);
1938
1939         private:
1940             oclMat samples_ocl;
1941         };
1942
1943         /*!***************  SVM  *************!*/
1944         class CV_EXPORTS CvSVM_OCL : public CvSVM
1945         {
1946         public:
1947             CvSVM_OCL();
1948
1949             CvSVM_OCL(const cv::Mat& trainData, const cv::Mat& responses,
1950                       const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(),
1951                       CvSVMParams params=CvSVMParams());
1952             CV_WRAP float predict( const int row_index, Mat& src, bool returnDFVal=false ) const;
1953             CV_WRAP void predict( cv::InputArray samples, cv::OutputArray results ) const;
1954             CV_WRAP float predict( const cv::Mat& sample, bool returnDFVal=false ) const;
1955             float predict( const CvMat* samples, CV_OUT CvMat* results ) const;
1956
1957         protected:
1958             float predict( const int row_index, int row_len, Mat& src, bool returnDFVal=false ) const;
1959             void create_kernel();
1960             void create_solver();
1961         };
1962
1963         /*!***************  END  *************!*/
1964     }
1965 }
1966 #if defined _MSC_VER && _MSC_VER >= 1200
1967 #  pragma warning( push)
1968 #  pragma warning( disable: 4267)
1969 #endif
1970 #include "opencv2/ocl/matrix_operations.hpp"
1971 #if defined _MSC_VER && _MSC_VER >= 1200
1972 #  pragma warning( pop)
1973 #endif
1974
1975 #endif /* __OPENCV_OCL_HPP__ */