1 /*M///////////////////////////////////////////////////////////////////////////////////////
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
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.
11 // For Open Source Computer Vision Library
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.
18 // Redistribution and use in source and binary forms, with or without modification,
19 // are permitted provided that the following conditions are met:
21 // * Redistribution's of source code must retain the above copyright notice,
22 // this list of conditions and the following disclaimer.
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.
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.
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.
44 #ifndef __OPENCV_OCL_HPP__
45 #define __OPENCV_OCL_HPP__
50 #include "opencv2/core.hpp"
51 #include "opencv2/imgproc.hpp"
52 #include "opencv2/objdetect.hpp"
53 #include "opencv2/ml.hpp"
61 CVCL_DEVICE_TYPE_DEFAULT = (1 << 0),
62 CVCL_DEVICE_TYPE_CPU = (1 << 1),
63 CVCL_DEVICE_TYPE_GPU = (1 << 2),
64 CVCL_DEVICE_TYPE_ACCELERATOR = (1 << 3),
65 //CVCL_DEVICE_TYPE_CUSTOM = (1 << 4)
66 CVCL_DEVICE_TYPE_ALL = 0xFFFFFFFF
78 DEVICE_MEM_DEFAULT = 0,
79 DEVICE_MEM_AHP, //alloc host pointer
80 DEVICE_MEM_UHP, //use host pointer
81 DEVICE_MEM_CHP, //copy host pointer
82 DEVICE_MEM_PM //persistent memory
85 // these classes contain OpenCL runtime information
92 int _id; // reserved, don't use it
94 DeviceType deviceType;
95 std::string deviceProfile;
96 std::string deviceVersion;
97 std::string deviceName;
98 std::string deviceVendor;
100 std::string deviceDriverVersion;
101 std::string deviceExtensions;
103 size_t maxWorkGroupSize;
104 std::vector<size_t> maxWorkItemSizes;
106 size_t localMemorySize;
107 size_t maxMemAllocSize;
109 int deviceVersionMajor;
110 int deviceVersionMinor;
112 bool haveDoubleSupport;
113 bool isUnifiedMemory; // 1 means integrated GPU, otherwise this value is 0
116 std::string compilationExtraOptions;
118 const PlatformInfo* platform;
126 int _id; // reserved, don't use it
128 std::string platformProfile;
129 std::string platformVersion;
130 std::string platformName;
131 std::string platformVendor;
132 std::string platformExtensons;
134 int platformVersionMajor;
135 int platformVersionMinor;
137 std::vector<const DeviceInfo*> devices;
143 //////////////////////////////// Initialization & Info ////////////////////////
144 typedef std::vector<const PlatformInfo*> PlatformsInfo;
146 CV_EXPORTS int getOpenCLPlatforms(PlatformsInfo& platforms);
148 typedef std::vector<const DeviceInfo*> DevicesInfo;
150 CV_EXPORTS int getOpenCLDevices(DevicesInfo& devices, int deviceType = CVCL_DEVICE_TYPE_GPU,
151 const PlatformInfo* platform = NULL);
153 // set device you want to use
154 CV_EXPORTS void setDevice(const DeviceInfo* info);
156 // Initialize from OpenCL handles directly.
157 // Argument types is (pointers): cl_platform_id*, cl_context*, cl_device_id*
158 CV_EXPORTS void initializeContext(void* pClPlatform, void* pClContext, void* pClDevice);
162 FEATURE_CL_DOUBLE = 1,
163 FEATURE_CL_UNIFIED_MEM,
165 FEATURE_CL_INTEL_DEVICE
168 // Represents OpenCL context, interface
169 class CV_EXPORTS Context
175 static Context *getContext();
177 bool supportsFeature(FEATURE_TYPE featureType) const;
178 const DeviceInfo& getDeviceInfo() const;
180 const void* getOpenCLContextPtr() const;
181 const void* getOpenCLCommandQueuePtr() const;
182 const void* getOpenCLDeviceIDPtr() const;
185 inline const void *getClContextPtr()
187 return Context::getContext()->getOpenCLContextPtr();
190 inline const void *getClCommandQueuePtr()
192 return Context::getContext()->getOpenCLCommandQueuePtr();
195 CV_EXPORTS bool supportsFeature(FEATURE_TYPE featureType);
197 CV_EXPORTS void finish();
199 enum BINARY_CACHE_MODE
201 CACHE_NONE = 0, // do not cache OpenCL binary
202 CACHE_DEBUG = 0x1 << 0, // cache OpenCL binary when built in debug mode
203 CACHE_RELEASE = 0x1 << 1, // default behavior, only cache when built in release mode
204 CACHE_ALL = CACHE_DEBUG | CACHE_RELEASE, // cache opencl binary
206 //! Enable or disable OpenCL program binary caching onto local disk
207 // After a program (*.cl files in opencl/ folder) is built at runtime, we allow the
208 // compiled OpenCL program to be cached to the path automatically as "path/*.clb"
209 // binary file, which will be reused when the OpenCV executable is started again.
211 // This feature is enabled by default.
212 CV_EXPORTS void setBinaryDiskCache(int mode = CACHE_RELEASE, cv::String path = "./");
214 //! set where binary cache to be saved to
215 CV_EXPORTS void setBinaryPath(const char *path);
220 const char* programStr;
221 const char* programHash;
223 // Cache in memory by name (should be unique). Caching on disk disabled.
224 inline ProgramSource(const char* _name, const char* _programStr)
225 : name(_name), programStr(_programStr), programHash(NULL)
229 // Cache in memory by name (should be unique). Caching on disk uses programHash mark.
230 inline ProgramSource(const char* _name, const char* _programStr, const char* _programHash)
231 : name(_name), programStr(_programStr), programHash(_programHash)
236 //! Calls OpenCL kernel. Pass globalThreads = NULL, and cleanUp = true, to finally clean-up without executing.
237 //! Deprecated, will be replaced
238 CV_EXPORTS void openCLExecuteKernelInterop(Context *clCxt,
239 const cv::ocl::ProgramSource& source, String kernelName,
240 size_t globalThreads[3], size_t localThreads[3],
241 std::vector< std::pair<size_t, const void *> > &args,
242 int channels, int depth, const char *build_options);
244 class CV_EXPORTS oclMatExpr;
245 //////////////////////////////// oclMat ////////////////////////////////
246 class CV_EXPORTS oclMat
249 //! default constructor
251 //! constructs oclMatrix of the specified size and type (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
252 oclMat(int rows, int cols, int type);
253 oclMat(Size size, int type);
254 //! constucts oclMatrix and fills it with the specified value _s.
255 oclMat(int rows, int cols, int type, const Scalar &s);
256 oclMat(Size size, int type, const Scalar &s);
258 oclMat(const oclMat &m);
260 //! constructor for oclMatrix headers pointing to user-allocated data
261 oclMat(int rows, int cols, int type, void *data, size_t step = Mat::AUTO_STEP);
262 oclMat(Size size, int type, void *data, size_t step = Mat::AUTO_STEP);
264 //! creates a matrix header for a part of the bigger matrix
265 oclMat(const oclMat &m, const Range &rowRange, const Range &colRange);
266 oclMat(const oclMat &m, const Rect &roi);
268 //! builds oclMat from Mat. Perfom blocking upload to device.
269 explicit oclMat (const Mat &m);
271 //! destructor - calls release()
274 //! assignment operators
275 oclMat &operator = (const oclMat &m);
276 //! assignment operator. Perfom blocking upload to device.
277 oclMat &operator = (const Mat &m);
278 oclMat &operator = (const oclMatExpr& expr);
280 //! pefroms blocking upload data to oclMat.
281 void upload(const cv::Mat &m);
284 //! downloads data from device to host memory. Blocking calls.
285 operator Mat() const;
286 void download(cv::Mat &m) const;
288 //! convert to _InputArray
289 operator _InputArray();
291 //! convert to _OutputArray
292 operator _OutputArray();
294 //! returns a new oclMatrix header for the specified row
295 oclMat row(int y) const;
296 //! returns a new oclMatrix header for the specified column
297 oclMat col(int x) const;
298 //! ... for the specified row span
299 oclMat rowRange(int startrow, int endrow) const;
300 oclMat rowRange(const Range &r) const;
301 //! ... for the specified column span
302 oclMat colRange(int startcol, int endcol) const;
303 oclMat colRange(const Range &r) const;
305 //! returns deep copy of the oclMatrix, i.e. the data is copied
306 oclMat clone() const;
308 //! copies those oclMatrix elements to "m" that are marked with non-zero mask elements.
309 // It calls m.create(this->size(), this->type()).
310 // It supports any data type
311 void copyTo( oclMat &m, const oclMat &mask = oclMat()) const;
313 //! converts oclMatrix to another datatype with optional scalng. See cvConvertScale.
314 void convertTo( oclMat &m, int rtype, double alpha = 1, double beta = 0 ) const;
316 void assignTo( oclMat &m, int type = -1 ) const;
318 //! sets every oclMatrix element to s
319 oclMat& operator = (const Scalar &s);
320 //! sets some of the oclMatrix elements to s, according to the mask
321 oclMat& setTo(const Scalar &s, const oclMat &mask = oclMat());
322 //! creates alternative oclMatrix header for the same data, with different
323 // number of channels and/or different number of rows. see cvReshape.
324 oclMat reshape(int cn, int rows = 0) const;
326 //! allocates new oclMatrix data unless the oclMatrix already has specified size and type.
327 // previous data is unreferenced if needed.
328 void create(int rows, int cols, int type);
329 void create(Size size, int type);
331 //! allocates new oclMatrix with specified device memory type.
332 void createEx(int rows, int cols, int type,
333 DevMemRW rw_type, DevMemType mem_type);
334 void createEx(Size size, int type, DevMemRW rw_type,
335 DevMemType mem_type);
337 //! decreases reference counter;
338 // deallocate the data when reference counter reaches 0.
341 //! swaps with other smart pointer
342 void swap(oclMat &mat);
344 //! locates oclMatrix header within a parent oclMatrix. See below
345 void locateROI( Size &wholeSize, Point &ofs ) const;
346 //! moves/resizes the current oclMatrix ROI inside the parent oclMatrix.
347 oclMat& adjustROI( int dtop, int dbottom, int dleft, int dright );
348 //! extracts a rectangular sub-oclMatrix
349 // (this is a generalized form of row, rowRange etc.)
350 oclMat operator()( Range rowRange, Range colRange ) const;
351 oclMat operator()( const Rect &roi ) const;
353 oclMat& operator+=( const oclMat& m );
354 oclMat& operator-=( const oclMat& m );
355 oclMat& operator*=( const oclMat& m );
356 oclMat& operator/=( const oclMat& m );
358 //! returns true if the oclMatrix data is continuous
359 // (i.e. when there are no gaps between successive rows).
360 // similar to CV_IS_oclMat_CONT(cvoclMat->type)
361 bool isContinuous() const;
362 //! returns element size in bytes,
363 // similar to CV_ELEM_SIZE(cvMat->type)
364 size_t elemSize() const;
365 //! returns the size of element channel in bytes.
366 size_t elemSize1() const;
367 //! returns element type, similar to CV_MAT_TYPE(cvMat->type)
369 //! returns element type, i.e. 8UC3 returns 8UC4 because in ocl
370 //! 3 channels element actually use 4 channel space
372 //! returns element type, similar to CV_MAT_DEPTH(cvMat->type)
374 //! returns element type, similar to CV_MAT_CN(cvMat->type)
375 int channels() const;
376 //! returns element type, return 4 for 3 channels element,
377 //!becuase 3 channels element actually use 4 channel space
378 int oclchannels() const;
379 //! returns step/elemSize1()
380 size_t step1() const;
381 //! returns oclMatrix size:
382 // width == number of columns, height == number of rows
384 //! returns true if oclMatrix data is NULL
387 //! matrix transposition
390 /*! includes several bit-fields:
391 - the magic signature
397 //! the number of rows and columns
399 //! a distance between successive rows in bytes; includes the gap if any
401 //! pointer to the data(OCL memory object)
404 //! pointer to the reference counter;
405 // when oclMatrix points to user-allocated data, the pointer is NULL
408 //! helper fields used in locateROI and adjustROI
409 //datastart and dataend are not used in current version
413 //! OpenCL context associated with the oclMat object.
414 Context *clCxt; // TODO clCtx
415 //add offset for handle ROI, calculated in byte
417 //add wholerows and wholecols for the whole matrix, datastart and dataend are no longer used
422 // convert InputArray/OutputArray to oclMat references
423 CV_EXPORTS oclMat& getOclMatRef(InputArray src);
424 CV_EXPORTS oclMat& getOclMatRef(OutputArray src);
426 ///////////////////// mat split and merge /////////////////////////////////
427 //! Compose a multi-channel array from several single-channel arrays
429 CV_EXPORTS void merge(const oclMat *src, size_t n, oclMat &dst);
430 CV_EXPORTS void merge(const std::vector<oclMat> &src, oclMat &dst);
432 //! Divides multi-channel array into several single-channel arrays
434 CV_EXPORTS void split(const oclMat &src, oclMat *dst);
435 CV_EXPORTS void split(const oclMat &src, std::vector<oclMat> &dst);
437 ////////////////////////////// Arithmetics ///////////////////////////////////
439 //! adds one matrix to another with scale (dst = src1 * alpha + src2 * beta + gama)
440 // supports all data types
441 CV_EXPORTS void addWeighted(const oclMat &src1, double alpha, const oclMat &src2, double beta, double gama, oclMat &dst);
443 //! adds one matrix to another (dst = src1 + src2)
444 // supports all data types
445 CV_EXPORTS void add(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
446 //! adds scalar to a matrix (dst = src1 + s)
447 // supports all data types
448 CV_EXPORTS void add(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
450 //! subtracts one matrix from another (dst = src1 - src2)
451 // supports all data types
452 CV_EXPORTS void subtract(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
453 //! subtracts scalar from a matrix (dst = src1 - s)
454 // supports all data types
455 CV_EXPORTS void subtract(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
457 //! computes element-wise product of the two arrays (dst = src1 * scale * src2)
458 // supports all data types
459 CV_EXPORTS void multiply(const oclMat &src1, const oclMat &src2, oclMat &dst, double scale = 1);
460 //! multiplies matrix to a number (dst = scalar * src)
461 // supports all data types
462 CV_EXPORTS void multiply(double scalar, const oclMat &src, oclMat &dst);
464 //! computes element-wise quotient of the two arrays (dst = src1 * scale / src2)
465 // supports all data types
466 CV_EXPORTS void divide(const oclMat &src1, const oclMat &src2, oclMat &dst, double scale = 1);
467 //! computes element-wise quotient of the two arrays (dst = scale / src)
468 // supports all data types
469 CV_EXPORTS void divide(double scale, const oclMat &src1, oclMat &dst);
471 //! computes element-wise minimum of the two arrays (dst = min(src1, src2))
472 // supports all data types
473 CV_EXPORTS void min(const oclMat &src1, const oclMat &src2, oclMat &dst);
475 //! computes element-wise maximum of the two arrays (dst = max(src1, src2))
476 // supports all data types
477 CV_EXPORTS void max(const oclMat &src1, const oclMat &src2, oclMat &dst);
479 //! compares elements of two arrays (dst = src1 <cmpop> src2)
480 // supports all data types
481 CV_EXPORTS void compare(const oclMat &src1, const oclMat &src2, oclMat &dst, int cmpop);
483 //! transposes the matrix
484 // supports all data types
485 CV_EXPORTS void transpose(const oclMat &src, oclMat &dst);
487 //! computes element-wise absolute values of an array (dst = abs(src))
488 // supports all data types
489 CV_EXPORTS void abs(const oclMat &src, oclMat &dst);
491 //! computes element-wise absolute difference of two arrays (dst = abs(src1 - src2))
492 // supports all data types
493 CV_EXPORTS void absdiff(const oclMat &src1, const oclMat &src2, oclMat &dst);
494 //! computes element-wise absolute difference of array and scalar (dst = abs(src1 - s))
495 // supports all data types
496 CV_EXPORTS void absdiff(const oclMat &src1, const Scalar &s, oclMat &dst);
498 //! computes mean value and standard deviation of all or selected array elements
499 // supports all data types
500 CV_EXPORTS void meanStdDev(const oclMat &mtx, Scalar &mean, Scalar &stddev);
502 //! computes norm of array
503 // supports NORM_INF, NORM_L1, NORM_L2
504 // supports all data types
505 CV_EXPORTS double norm(const oclMat &src1, int normType = NORM_L2);
507 //! computes norm of the difference between two arrays
508 // supports NORM_INF, NORM_L1, NORM_L2
509 // supports all data types
510 CV_EXPORTS double norm(const oclMat &src1, const oclMat &src2, int normType = NORM_L2);
512 //! reverses the order of the rows, columns or both in a matrix
513 // supports all types
514 CV_EXPORTS void flip(const oclMat &src, oclMat &dst, int flipCode);
516 //! computes sum of array elements
518 CV_EXPORTS Scalar sum(const oclMat &m);
519 CV_EXPORTS Scalar absSum(const oclMat &m);
520 CV_EXPORTS Scalar sqrSum(const oclMat &m);
522 //! finds global minimum and maximum array elements and returns their values
523 // support all C1 types
524 CV_EXPORTS void minMax(const oclMat &src, double *minVal, double *maxVal = 0, const oclMat &mask = oclMat());
526 //! finds global minimum and maximum array elements and returns their values with locations
527 // support all C1 types
528 CV_EXPORTS void minMaxLoc(const oclMat &src, double *minVal, double *maxVal = 0, Point *minLoc = 0, Point *maxLoc = 0,
529 const oclMat &mask = oclMat());
531 //! counts non-zero array elements
533 CV_EXPORTS int countNonZero(const oclMat &src);
535 //! transforms 8-bit unsigned integers using lookup table: dst(i)=lut(src(i))
536 // destination array will have the depth type as lut and the same channels number as source
537 //It supports 8UC1 8UC4 only
538 CV_EXPORTS void LUT(const oclMat &src, const oclMat &lut, oclMat &dst);
540 //! only 8UC1 and 256 bins is supported now
541 CV_EXPORTS void calcHist(const oclMat &mat_src, oclMat &mat_hist);
542 //! only 8UC1 and 256 bins is supported now
543 CV_EXPORTS void equalizeHist(const oclMat &mat_src, oclMat &mat_dst);
545 //! only 8UC1 is supported now
546 CV_EXPORTS Ptr<cv::CLAHE> createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8));
549 // supports 8UC1 8UC4
550 CV_EXPORTS void bilateralFilter(const oclMat& src, oclMat& dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT);
552 //! Applies an adaptive bilateral filter to the input image
553 // Unlike the usual bilateral filter that uses fixed value for sigmaColor,
554 // the adaptive version calculates the local variance in he ksize neighborhood
555 // and use this as sigmaColor, for the value filtering. However, the local standard deviation is
556 // clamped to the maxSigmaColor.
557 // supports 8UC1, 8UC3
558 CV_EXPORTS void adaptiveBilateralFilter(const oclMat& src, oclMat& dst, Size ksize, double sigmaSpace, double maxSigmaColor=20.0, Point anchor = Point(-1, -1), int borderType=BORDER_DEFAULT);
560 //! computes exponent of each matrix element (dst = e**src)
561 // supports only CV_32FC1, CV_64FC1 type
562 CV_EXPORTS void exp(const oclMat &src, oclMat &dst);
564 //! computes natural logarithm of absolute value of each matrix element: dst = log(abs(src))
565 // supports only CV_32FC1, CV_64FC1 type
566 CV_EXPORTS void log(const oclMat &src, oclMat &dst);
568 //! computes square root of each matrix element
569 // supports only CV_32FC1, CV_64FC1 type
570 CV_EXPORTS void sqrt(const oclMat &src, oclMat &dst);
572 //! computes magnitude of each (x(i), y(i)) vector
573 // supports only CV_32F, CV_64F type
574 CV_EXPORTS void magnitude(const oclMat &x, const oclMat &y, oclMat &magnitude);
576 //! computes angle (angle(i)) of each (x(i), y(i)) vector
577 // supports only CV_32F, CV_64F type
578 CV_EXPORTS void phase(const oclMat &x, const oclMat &y, oclMat &angle, bool angleInDegrees = false);
580 //! the function raises every element of tne input array to p
581 // support only CV_32F, CV_64F type
582 CV_EXPORTS void pow(const oclMat &x, double p, oclMat &y);
584 //! converts Cartesian coordinates to polar
585 // supports only CV_32F CV_64F type
586 CV_EXPORTS void cartToPolar(const oclMat &x, const oclMat &y, oclMat &magnitude, oclMat &angle, bool angleInDegrees = false);
588 //! converts polar coordinates to Cartesian
589 // supports only CV_32F CV_64F type
590 CV_EXPORTS void polarToCart(const oclMat &magnitude, const oclMat &angle, oclMat &x, oclMat &y, bool angleInDegrees = false);
592 //! perfroms per-elements bit-wise inversion
593 // supports all types
594 CV_EXPORTS void bitwise_not(const oclMat &src, oclMat &dst);
596 //! calculates per-element bit-wise disjunction of two arrays
597 // supports all types
598 CV_EXPORTS void bitwise_or(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
599 CV_EXPORTS void bitwise_or(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
601 //! calculates per-element bit-wise conjunction of two arrays
602 // supports all types
603 CV_EXPORTS void bitwise_and(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
604 CV_EXPORTS void bitwise_and(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
606 //! calculates per-element bit-wise "exclusive or" operation
607 // supports all types
608 CV_EXPORTS void bitwise_xor(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat());
609 CV_EXPORTS void bitwise_xor(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat());
611 //! Logical operators
612 CV_EXPORTS oclMat operator ~ (const oclMat &);
613 CV_EXPORTS oclMat operator | (const oclMat &, const oclMat &);
614 CV_EXPORTS oclMat operator & (const oclMat &, const oclMat &);
615 CV_EXPORTS oclMat operator ^ (const oclMat &, const oclMat &);
618 //! Mathematics operators
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 CV_EXPORTS oclMatExpr operator / (const oclMat &src1, const oclMat &src2);
624 struct CV_EXPORTS ConvolveBuf
628 Size user_block_size;
631 oclMat image_spect, templ_spect, result_spect;
632 oclMat image_block, templ_block, result_data;
634 void create(Size image_size, Size templ_size);
635 static Size estimateBlockSize(Size result_size, Size templ_size);
638 //! computes convolution of two images, may use discrete Fourier transform
639 // support only CV_32FC1 type
640 CV_EXPORTS void convolve(const oclMat &image, const oclMat &temp1, oclMat &result, bool ccorr = false);
641 CV_EXPORTS void convolve(const oclMat &image, const oclMat &temp1, oclMat &result, bool ccorr, ConvolveBuf& buf);
643 //! Performs a per-element multiplication of two Fourier spectrums.
644 //! Only full (not packed) CV_32FC2 complex spectrums in the interleaved format are supported for now.
645 //! support only CV_32FC2 type
646 CV_EXPORTS void mulSpectrums(const oclMat &a, const oclMat &b, oclMat &c, int flags, float scale, bool conjB = false);
648 CV_EXPORTS void cvtColor(const oclMat &src, oclMat &dst, int code, int dcn = 0);
650 //! initializes a scaled identity matrix
651 CV_EXPORTS void setIdentity(oclMat& src, const Scalar & val = Scalar(1));
653 //! fills the output array with repeated copies of the input array
654 CV_EXPORTS void repeat(const oclMat & src, int ny, int nx, oclMat & dst);
656 //////////////////////////////// Filter Engine ////////////////////////////////
659 The Base Class for 1D or Row-wise Filters
661 This is the base class for linear or non-linear filters that process 1D data.
662 In particular, such filters are used for the "horizontal" filtering parts in separable filters.
664 class CV_EXPORTS BaseRowFilter_GPU
667 BaseRowFilter_GPU(int ksize_, int anchor_, int bordertype_) : ksize(ksize_), anchor(anchor_), bordertype(bordertype_) {}
668 virtual ~BaseRowFilter_GPU() {}
669 virtual void operator()(const oclMat &src, oclMat &dst) = 0;
670 int ksize, anchor, bordertype;
674 The Base Class for Column-wise Filters
676 This is the base class for linear or non-linear filters that process columns of 2D arrays.
677 Such filters are used for the "vertical" filtering parts in separable filters.
679 class CV_EXPORTS BaseColumnFilter_GPU
682 BaseColumnFilter_GPU(int ksize_, int anchor_, int bordertype_) : ksize(ksize_), anchor(anchor_), bordertype(bordertype_) {}
683 virtual ~BaseColumnFilter_GPU() {}
684 virtual void operator()(const oclMat &src, oclMat &dst) = 0;
685 int ksize, anchor, bordertype;
689 The Base Class for Non-Separable 2D Filters.
691 This is the base class for linear or non-linear 2D filters.
693 class CV_EXPORTS BaseFilter_GPU
696 BaseFilter_GPU(const Size &ksize_, const Point &anchor_, const int &borderType_)
697 : ksize(ksize_), anchor(anchor_), borderType(borderType_) {}
698 virtual ~BaseFilter_GPU() {}
699 virtual void operator()(const oclMat &src, oclMat &dst) = 0;
706 The Base Class for Filter Engine.
708 The class can be used to apply an arbitrary filtering operation to an image.
709 It contains all the necessary intermediate buffers.
711 class CV_EXPORTS FilterEngine_GPU
714 virtual ~FilterEngine_GPU() {}
716 virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1)) = 0;
719 //! returns the non-separable filter engine with the specified filter
720 CV_EXPORTS Ptr<FilterEngine_GPU> createFilter2D_GPU(const Ptr<BaseFilter_GPU> filter2D);
722 //! returns the primitive row filter with the specified kernel
723 CV_EXPORTS Ptr<BaseRowFilter_GPU> getLinearRowFilter_GPU(int srcType, int bufType, const Mat &rowKernel,
724 int anchor = -1, int bordertype = BORDER_DEFAULT);
726 //! returns the primitive column filter with the specified kernel
727 CV_EXPORTS Ptr<BaseColumnFilter_GPU> getLinearColumnFilter_GPU(int bufType, int dstType, const Mat &columnKernel,
728 int anchor = -1, int bordertype = BORDER_DEFAULT, double delta = 0.0);
730 //! returns the separable linear filter engine
731 CV_EXPORTS Ptr<FilterEngine_GPU> createSeparableLinearFilter_GPU(int srcType, int dstType, const Mat &rowKernel,
732 const Mat &columnKernel, const Point &anchor = Point(-1, -1), double delta = 0.0, int bordertype = BORDER_DEFAULT);
734 //! returns the separable filter engine with the specified filters
735 CV_EXPORTS Ptr<FilterEngine_GPU> createSeparableFilter_GPU(const Ptr<BaseRowFilter_GPU> &rowFilter,
736 const Ptr<BaseColumnFilter_GPU> &columnFilter);
738 //! returns the Gaussian filter engine
739 CV_EXPORTS Ptr<FilterEngine_GPU> createGaussianFilter_GPU(int type, Size ksize, double sigma1, double sigma2 = 0, int bordertype = BORDER_DEFAULT);
741 //! returns filter engine for the generalized Sobel operator
742 CV_EXPORTS Ptr<FilterEngine_GPU> createDerivFilter_GPU( int srcType, int dstType, int dx, int dy, int ksize, int borderType = BORDER_DEFAULT );
744 //! applies Laplacian operator to the image
745 // supports only ksize = 1 and ksize = 3
746 CV_EXPORTS void Laplacian(const oclMat &src, oclMat &dst, int ddepth, int ksize = 1, double scale = 1,
747 double delta=0, int borderType=BORDER_DEFAULT);
749 //! returns 2D box filter
750 // dst type must be the same as source type
751 CV_EXPORTS Ptr<BaseFilter_GPU> getBoxFilter_GPU(int srcType, int dstType,
752 const Size &ksize, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
754 //! returns box filter engine
755 CV_EXPORTS Ptr<FilterEngine_GPU> createBoxFilter_GPU(int srcType, int dstType, const Size &ksize,
756 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
758 //! returns 2D filter with the specified kernel
759 // supports: dst type must be the same as source type
760 CV_EXPORTS Ptr<BaseFilter_GPU> getLinearFilter_GPU(int srcType, int dstType, const Mat &kernel, const Size &ksize,
761 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
763 //! returns the non-separable linear filter engine
764 // supports: dst type must be the same as source type
765 CV_EXPORTS Ptr<FilterEngine_GPU> createLinearFilter_GPU(int srcType, int dstType, const Mat &kernel,
766 const Point &anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
768 //! smooths the image using the normalized box filter
769 CV_EXPORTS void boxFilter(const oclMat &src, oclMat &dst, int ddepth, Size ksize,
770 Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT);
772 //! returns 2D morphological filter
773 //! only MORPH_ERODE and MORPH_DILATE are supported
774 // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
775 // kernel must have CV_8UC1 type, one rows and cols == ksize.width * ksize.height
776 CV_EXPORTS Ptr<BaseFilter_GPU> getMorphologyFilter_GPU(int op, int type, const Mat &kernel, const Size &ksize,
777 Point anchor = Point(-1, -1));
779 //! returns morphological filter engine. Only MORPH_ERODE and MORPH_DILATE are supported.
780 CV_EXPORTS Ptr<FilterEngine_GPU> createMorphologyFilter_GPU(int op, int type, const Mat &kernel,
781 const Point &anchor = Point(-1, -1), int iterations = 1);
783 //! a synonym for normalized box filter
784 static inline void blur(const oclMat &src, oclMat &dst, Size ksize, Point anchor = Point(-1, -1),
785 int borderType = BORDER_CONSTANT)
787 boxFilter(src, dst, -1, ksize, anchor, borderType);
790 //! applies non-separable 2D linear filter to the image
791 CV_EXPORTS void filter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernel,
792 Point anchor = Point(-1, -1), double delta = 0.0, int borderType = BORDER_DEFAULT);
794 //! applies separable 2D linear filter to the image
795 CV_EXPORTS void sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernelX, const Mat &kernelY,
796 Point anchor = Point(-1, -1), double delta = 0.0, int bordertype = BORDER_DEFAULT);
798 //! applies generalized Sobel operator to the image
799 // dst.type must equalize src.type
800 // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
801 // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
802 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);
804 //! applies the vertical or horizontal Scharr operator to the image
805 // dst.type must equalize src.type
806 // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
807 // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
808 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);
810 //! smooths the image using Gaussian filter.
811 // dst.type must equalize src.type
812 // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
813 // supports border type: BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT,BORDER_REFLECT_101
814 CV_EXPORTS void GaussianBlur(const oclMat &src, oclMat &dst, Size ksize, double sigma1, double sigma2 = 0, int bordertype = BORDER_DEFAULT);
816 //! erodes the image (applies the local minimum operator)
817 // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
818 CV_EXPORTS void erode( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
820 int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
823 //! dilates the image (applies the local maximum operator)
824 // supports data type: CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4
825 CV_EXPORTS void dilate( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
827 int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
830 //! applies an advanced morphological operation to the image
831 CV_EXPORTS void morphologyEx( const oclMat &src, oclMat &dst, int op, const Mat &kernel, Point anchor = Point(-1, -1), int iterations = 1,
833 int borderType = BORDER_CONSTANT, const Scalar &borderValue = morphologyDefaultBorderValue());
836 ////////////////////////////// Image processing //////////////////////////////
837 //! Does mean shift filtering on GPU.
838 CV_EXPORTS void meanShiftFiltering(const oclMat &src, oclMat &dst, int sp, int sr,
839 TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
841 //! Does mean shift procedure on GPU.
842 CV_EXPORTS void meanShiftProc(const oclMat &src, oclMat &dstr, oclMat &dstsp, int sp, int sr,
843 TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
845 //! Does mean shift segmentation with elimiation of small regions.
846 CV_EXPORTS void meanShiftSegmentation(const oclMat &src, Mat &dst, int sp, int sr, int minsize,
847 TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1));
849 //! applies fixed threshold to the image.
850 // supports CV_8UC1 and CV_32FC1 data type
851 // supports threshold type: THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV
852 CV_EXPORTS double threshold(const oclMat &src, oclMat &dst, double thresh, double maxVal, int type = THRESH_TRUNC);
854 //! resizes the image
855 // Supports INTER_NEAREST, INTER_LINEAR
856 // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
857 CV_EXPORTS void resize(const oclMat &src, oclMat &dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
859 //! Applies a generic geometrical transformation to an image.
861 // Supports INTER_NEAREST, INTER_LINEAR.
862 // Map1 supports CV_16SC2, CV_32FC2 types.
863 // Src supports CV_8UC1, CV_8UC2, CV_8UC4.
864 CV_EXPORTS void remap(const oclMat &src, oclMat &dst, oclMat &map1, oclMat &map2, int interpolation, int bordertype, const Scalar &value = Scalar());
866 //! copies 2D array to a larger destination array and pads borders with user-specifiable constant
867 // supports CV_8UC1, CV_8UC4, CV_32SC1 types
868 CV_EXPORTS void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int boardtype, const Scalar &value = Scalar());
870 //! Smoothes image using median filter
871 // The source 1- or 4-channel image. m should be 3 or 5, the image depth should be CV_8U or CV_32F.
872 CV_EXPORTS void medianFilter(const oclMat &src, oclMat &dst, int m);
874 //! warps the image using affine transformation
875 // Supports INTER_NEAREST, INTER_LINEAR, INTER_CUBIC
876 // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
877 CV_EXPORTS void warpAffine(const oclMat &src, oclMat &dst, const Mat &M, Size dsize, int flags = INTER_LINEAR);
879 //! warps the image using perspective transformation
880 // Supports INTER_NEAREST, INTER_LINEAR, INTER_CUBIC
881 // supports CV_8UC1, CV_8UC4, CV_32FC1 and CV_32FC4 types
882 CV_EXPORTS void warpPerspective(const oclMat &src, oclMat &dst, const Mat &M, Size dsize, int flags = INTER_LINEAR);
884 //! computes the integral image and integral for the squared image
885 // sum will support CV_32S, CV_32F, sqsum - support CV32F, CV_64F
886 // supports only CV_8UC1 source type
887 CV_EXPORTS void integral(const oclMat &src, oclMat &sum, oclMat &sqsum, int sdepth=-1 );
888 CV_EXPORTS void integral(const oclMat &src, oclMat &sum, int sdepth=-1 );
889 CV_EXPORTS void cornerHarris(const oclMat &src, oclMat &dst, int blockSize, int ksize, double k, int bordertype = cv::BORDER_DEFAULT);
890 CV_EXPORTS void cornerHarris_dxdy(const oclMat &src, oclMat &dst, oclMat &Dx, oclMat &Dy,
891 int blockSize, int ksize, double k, int bordertype = cv::BORDER_DEFAULT);
892 CV_EXPORTS void cornerMinEigenVal(const oclMat &src, oclMat &dst, int blockSize, int ksize, int bordertype = cv::BORDER_DEFAULT);
893 CV_EXPORTS void cornerMinEigenVal_dxdy(const oclMat &src, oclMat &dst, oclMat &Dx, oclMat &Dy,
894 int blockSize, int ksize, int bordertype = cv::BORDER_DEFAULT);
897 /////////////////////////////////// ML ///////////////////////////////////////////
899 //! Compute closest centers for each lines in source and lable it after center's index
900 // supports CV_32FC1/CV_32FC2/CV_32FC4 data type
901 // supports NORM_L1 and NORM_L2 distType
902 // if indices is provided, only the indexed rows will be calculated and their results are in the same
904 CV_EXPORTS void distanceToCenters(const oclMat &src, const oclMat ¢ers, Mat &dists, Mat &labels, int distType = NORM_L2SQR);
906 //!Does k-means procedure on GPU
907 // supports CV_32FC1/CV_32FC2/CV_32FC4 data type
908 CV_EXPORTS double kmeans(const oclMat &src, int K, oclMat &bestLabels,
909 TermCriteria criteria, int attemps, int flags, oclMat ¢ers);
912 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
913 ///////////////////////////////////////////CascadeClassifier//////////////////////////////////////////////////////////////////
914 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
915 class CV_EXPORTS OclCascadeClassifier : public cv::CascadeClassifier
918 void detectMultiScale(oclMat &image, CV_OUT std::vector<cv::Rect>& faces,
919 double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0,
920 Size minSize = Size(), Size maxSize = Size());
923 /////////////////////////////// Pyramid /////////////////////////////////////
924 CV_EXPORTS void pyrDown(const oclMat &src, oclMat &dst);
926 //! upsamples the source image and then smoothes it
927 CV_EXPORTS void pyrUp(const oclMat &src, oclMat &dst);
929 //! performs linear blending of two images
930 //! to avoid accuracy errors sum of weigths shouldn't be very close to zero
931 // supports only CV_8UC1 source type
932 CV_EXPORTS void blendLinear(const oclMat &img1, const oclMat &img2, const oclMat &weights1, const oclMat &weights2, oclMat &result);
934 //! computes vertical sum, supports only CV_32FC1 images
935 CV_EXPORTS void columnSum(const oclMat &src, oclMat &sum);
937 ///////////////////////////////////////// match_template /////////////////////////////////////////////////////////////
938 struct CV_EXPORTS MatchTemplateBuf
940 Size user_block_size;
941 oclMat imagef, templf;
942 std::vector<oclMat> images;
943 std::vector<oclMat> image_sums;
944 std::vector<oclMat> image_sqsums;
947 //! computes the proximity map for the raster template and the image where the template is searched for
948 // Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
949 // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
950 CV_EXPORTS void matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method);
952 //! computes the proximity map for the raster template and the image where the template is searched for
953 // Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
954 // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
955 CV_EXPORTS void matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method, MatchTemplateBuf &buf);
959 ///////////////////////////////////////////// Canny /////////////////////////////////////////////
960 struct CV_EXPORTS CannyBuf;
962 //! compute edges of the input image using Canny operator
963 // Support CV_8UC1 only
964 CV_EXPORTS void Canny(const oclMat &image, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false);
965 CV_EXPORTS void Canny(const oclMat &image, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false);
966 CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false);
967 CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false);
969 struct CV_EXPORTS CannyBuf
971 CannyBuf() : counter(1, 1, CV_32S) { }
976 explicit CannyBuf(const Size &image_size, int apperture_size = 3) : counter(1, 1, CV_32S)
978 create(image_size, apperture_size);
980 CannyBuf(const oclMat &dx_, const oclMat &dy_);
981 void create(const Size &image_size, int apperture_size = 3);
985 oclMat dx_buf, dy_buf;
986 oclMat magBuf, mapBuf;
987 oclMat trackBuf1, trackBuf2;
989 Ptr<FilterEngine_GPU> filterDX, filterDY;
992 ///////////////////////////////////////// Hough Transform /////////////////////////////////////////
994 struct HoughCirclesBuf
1003 CV_EXPORTS void HoughCircles(const oclMat& src, oclMat& circles, int method, float dp, float minDist, int cannyThreshold, int votesThreshold, int minRadius, int maxRadius, int maxCircles = 4096);
1004 CV_EXPORTS void HoughCircles(const oclMat& src, oclMat& circles, HoughCirclesBuf& buf, int method, float dp, float minDist, int cannyThreshold, int votesThreshold, int minRadius, int maxRadius, int maxCircles = 4096);
1005 CV_EXPORTS void HoughCirclesDownload(const oclMat& d_circles, OutputArray h_circles);
1008 ///////////////////////////////////////// clAmdFft related /////////////////////////////////////////
1009 //! Performs a forward or inverse discrete Fourier transform (1D or 2D) of floating point matrix.
1010 //! Param dft_size is the size of DFT transform.
1012 //! For complex-to-real transform it is assumed that the source matrix is packed in CLFFT's format.
1013 // support src type of CV32FC1, CV32FC2
1014 // support flags: DFT_INVERSE, DFT_REAL_OUTPUT, DFT_COMPLEX_OUTPUT, DFT_ROWS
1015 // dft_size is the size of original input, which is used for transformation from complex to real.
1016 // dft_size must be powers of 2, 3 and 5
1017 // real to complex dft requires at least v1.8 clAmdFft
1018 // real to complex dft output is not the same with cpu version
1019 // real to complex and complex to real does not support DFT_ROWS
1020 CV_EXPORTS void dft(const oclMat &src, oclMat &dst, Size dft_size = Size(), int flags = 0);
1022 //! implements generalized matrix product algorithm GEMM from BLAS
1023 // The functionality requires clAmdBlas library
1024 // only support type CV_32FC1
1025 // flag GEMM_3_T is not supported
1026 CV_EXPORTS void gemm(const oclMat &src1, const oclMat &src2, double alpha,
1027 const oclMat &src3, double beta, oclMat &dst, int flags = 0);
1029 //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector //////////////
1031 struct CV_EXPORTS HOGDescriptor
1035 enum { DEFAULT_WIN_SIGMA = -1 };
1037 enum { DEFAULT_NLEVELS = 64 };
1039 enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL };
1043 HOGDescriptor(Size win_size = Size(64, 128), Size block_size = Size(16, 16),
1045 Size block_stride = Size(8, 8), Size cell_size = Size(8, 8),
1047 int nbins = 9, double win_sigma = DEFAULT_WIN_SIGMA,
1049 double threshold_L2hys = 0.2, bool gamma_correction = true,
1051 int nlevels = DEFAULT_NLEVELS);
1055 size_t getDescriptorSize() const;
1057 size_t getBlockHistogramSize() const;
1061 void setSVMDetector(const std::vector<float> &detector);
1065 static std::vector<float> getDefaultPeopleDetector();
1067 static std::vector<float> getPeopleDetector48x96();
1069 static std::vector<float> getPeopleDetector64x128();
1073 void detect(const oclMat &img, std::vector<Point> &found_locations,
1075 double hit_threshold = 0, Size win_stride = Size(),
1077 Size padding = Size());
1081 void detectMultiScale(const oclMat &img, std::vector<Rect> &found_locations,
1083 double hit_threshold = 0, Size win_stride = Size(),
1085 Size padding = Size(), double scale0 = 1.05,
1087 int group_threshold = 2);
1091 void getDescriptors(const oclMat &img, Size win_stride,
1093 oclMat &descriptors,
1095 int descr_format = DESCR_FORMAT_COL_BY_COL);
1111 double threshold_L2hys;
1113 bool gamma_correction;
1121 // initialize buffers; only need to do once in case of multiscale detection
1123 void init_buffer(const oclMat &img, Size win_stride);
1127 void computeBlockHistograms(const oclMat &img);
1129 void computeGradient(const oclMat &img, oclMat &grad, oclMat &qangle);
1133 double getWinSigma() const;
1135 bool checkDetectorSize() const;
1139 static int numPartsWithin(int size, int part_size, int stride);
1141 static Size numPartsWithin(Size size, Size part_size, Size stride);
1145 // Coefficients of the separating plane
1153 // Results of the last classification step
1161 // Results of the last histogram evaluation step
1167 // Gradients conputation results
1169 oclMat grad, qangle;
1179 // effect size of input image (might be different from original size after scaling)
1186 ////////////////////////feature2d_ocl/////////////////
1187 /****************************************************************************************\
1189 \****************************************************************************************/
1190 template<typename T>
1191 struct CV_EXPORTS Accumulator
1195 template<> struct Accumulator<unsigned char>
1199 template<> struct Accumulator<unsigned short>
1203 template<> struct Accumulator<char>
1207 template<> struct Accumulator<short>
1213 * Manhattan distance (city block distance) functor
1216 struct CV_EXPORTS L1
1218 enum { normType = NORM_L1 };
1219 typedef T ValueType;
1220 typedef typename Accumulator<T>::Type ResultType;
1222 ResultType operator()( const T *a, const T *b, int size ) const
1224 return normL1<ValueType, ResultType>(a, b, size);
1229 * Euclidean distance functor
1232 struct CV_EXPORTS L2
1234 enum { normType = NORM_L2 };
1235 typedef T ValueType;
1236 typedef typename Accumulator<T>::Type ResultType;
1238 ResultType operator()( const T *a, const T *b, int size ) const
1240 return (ResultType)std::sqrt((double)normL2Sqr<ValueType, ResultType>(a, b, size));
1245 * Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor
1246 * bit count of A exclusive XOR'ed with B
1248 struct CV_EXPORTS Hamming
1250 enum { normType = NORM_HAMMING };
1251 typedef unsigned char ValueType;
1252 typedef int ResultType;
1254 /** this will count the bits in a ^ b
1256 ResultType operator()( const unsigned char *a, const unsigned char *b, int size ) const
1258 return normHamming(a, b, size);
1262 ////////////////////////////////// BruteForceMatcher //////////////////////////////////
1264 class CV_EXPORTS BruteForceMatcher_OCL_base
1267 enum DistType {L1Dist = 0, L2Dist, HammingDist};
1268 explicit BruteForceMatcher_OCL_base(DistType distType = L2Dist);
1270 // Add descriptors to train descriptor collection
1271 void add(const std::vector<oclMat> &descCollection);
1273 // Get train descriptors collection
1274 const std::vector<oclMat> &getTrainDescriptors() const;
1276 // Clear train descriptors collection
1279 // Return true if there are not train descriptors in collection
1282 // Return true if the matcher supports mask in match methods
1283 bool isMaskSupported() const;
1285 // Find one best match for each query descriptor
1286 void matchSingle(const oclMat &query, const oclMat &train,
1287 oclMat &trainIdx, oclMat &distance,
1288 const oclMat &mask = oclMat());
1290 // Download trainIdx and distance and convert it to CPU vector with DMatch
1291 static void matchDownload(const oclMat &trainIdx, const oclMat &distance, std::vector<DMatch> &matches);
1292 // Convert trainIdx and distance to vector with DMatch
1293 static void matchConvert(const Mat &trainIdx, const Mat &distance, std::vector<DMatch> &matches);
1295 // Find one best match for each query descriptor
1296 void match(const oclMat &query, const oclMat &train, std::vector<DMatch> &matches, const oclMat &mask = oclMat());
1298 // Make gpu collection of trains and masks in suitable format for matchCollection function
1299 void makeGpuCollection(oclMat &trainCollection, oclMat &maskCollection, const std::vector<oclMat> &masks = std::vector<oclMat>());
1301 // Find one best match from train collection for each query descriptor
1302 void matchCollection(const oclMat &query, const oclMat &trainCollection,
1303 oclMat &trainIdx, oclMat &imgIdx, oclMat &distance,
1304 const oclMat &masks = oclMat());
1306 // Download trainIdx, imgIdx and distance and convert it to vector with DMatch
1307 static void matchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, std::vector<DMatch> &matches);
1308 // Convert trainIdx, imgIdx and distance to vector with DMatch
1309 static void matchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, std::vector<DMatch> &matches);
1311 // Find one best match from train collection for each query descriptor.
1312 void match(const oclMat &query, std::vector<DMatch> &matches, const std::vector<oclMat> &masks = std::vector<oclMat>());
1314 // Find k best matches for each query descriptor (in increasing order of distances)
1315 void knnMatchSingle(const oclMat &query, const oclMat &train,
1316 oclMat &trainIdx, oclMat &distance, oclMat &allDist, int k,
1317 const oclMat &mask = oclMat());
1319 // Download trainIdx and distance and convert it to vector with DMatch
1320 // compactResult is used when mask is not empty. If compactResult is false matches
1321 // vector will have the same size as queryDescriptors rows. If compactResult is true
1322 // matches vector will not contain matches for fully masked out query descriptors.
1323 static void knnMatchDownload(const oclMat &trainIdx, const oclMat &distance,
1324 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1325 // Convert trainIdx and distance to vector with DMatch
1326 static void knnMatchConvert(const Mat &trainIdx, const Mat &distance,
1327 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1329 // Find k best matches for each query descriptor (in increasing order of distances).
1330 // compactResult is used when mask is not empty. If compactResult is false matches
1331 // vector will have the same size as queryDescriptors rows. If compactResult is true
1332 // matches vector will not contain matches for fully masked out query descriptors.
1333 void knnMatch(const oclMat &query, const oclMat &train,
1334 std::vector< std::vector<DMatch> > &matches, int k, const oclMat &mask = oclMat(),
1335 bool compactResult = false);
1337 // Find k best matches from train collection for each query descriptor (in increasing order of distances)
1338 void knnMatch2Collection(const oclMat &query, const oclMat &trainCollection,
1339 oclMat &trainIdx, oclMat &imgIdx, oclMat &distance,
1340 const oclMat &maskCollection = oclMat());
1342 // Download trainIdx and distance and convert it to vector with DMatch
1343 // compactResult is used when mask is not empty. If compactResult is false matches
1344 // vector will have the same size as queryDescriptors rows. If compactResult is true
1345 // matches vector will not contain matches for fully masked out query descriptors.
1346 static void knnMatch2Download(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance,
1347 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1348 // Convert trainIdx and distance to vector with DMatch
1349 static void knnMatch2Convert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance,
1350 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1352 // Find k best matches for each query descriptor (in increasing order of distances).
1353 // compactResult is used when mask is not empty. If compactResult is false matches
1354 // vector will have the same size as queryDescriptors rows. If compactResult is true
1355 // matches vector will not contain matches for fully masked out query descriptors.
1356 void knnMatch(const oclMat &query, std::vector< std::vector<DMatch> > &matches, int k,
1357 const std::vector<oclMat> &masks = std::vector<oclMat>(), bool compactResult = false);
1359 // Find best matches for each query descriptor which have distance less than maxDistance.
1360 // nMatches.at<int>(0, queryIdx) will contain matches count for queryIdx.
1361 // carefully nMatches can be greater than trainIdx.cols - it means that matcher didn't find all matches,
1362 // because it didn't have enough memory.
1363 // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nTrain / 100), 10),
1364 // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
1365 // Matches doesn't sorted.
1366 void radiusMatchSingle(const oclMat &query, const oclMat &train,
1367 oclMat &trainIdx, oclMat &distance, oclMat &nMatches, float maxDistance,
1368 const oclMat &mask = oclMat());
1370 // Download trainIdx, nMatches and distance and convert it to vector with DMatch.
1371 // matches will be sorted in increasing order of distances.
1372 // compactResult is used when mask is not empty. If compactResult is false matches
1373 // vector will have the same size as queryDescriptors rows. If compactResult is true
1374 // matches vector will not contain matches for fully masked out query descriptors.
1375 static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches,
1376 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1377 // Convert trainIdx, nMatches and distance to vector with DMatch.
1378 static void radiusMatchConvert(const Mat &trainIdx, const Mat &distance, const Mat &nMatches,
1379 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1381 // Find best matches for each query descriptor which have distance less than maxDistance
1382 // in increasing order of distances).
1383 void radiusMatch(const oclMat &query, const oclMat &train,
1384 std::vector< std::vector<DMatch> > &matches, float maxDistance,
1385 const oclMat &mask = oclMat(), bool compactResult = false);
1387 // Find best matches for each query descriptor which have distance less than maxDistance.
1388 // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nQuery / 100), 10),
1389 // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
1390 // Matches doesn't sorted.
1391 void radiusMatchCollection(const oclMat &query, oclMat &trainIdx, oclMat &imgIdx, oclMat &distance, oclMat &nMatches, float maxDistance,
1392 const std::vector<oclMat> &masks = std::vector<oclMat>());
1394 // Download trainIdx, imgIdx, nMatches and distance and convert it to vector with DMatch.
1395 // matches will be sorted in increasing order of distances.
1396 // compactResult is used when mask is not empty. If compactResult is false matches
1397 // vector will have the same size as queryDescriptors rows. If compactResult is true
1398 // matches vector will not contain matches for fully masked out query descriptors.
1399 static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, const oclMat &nMatches,
1400 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1401 // Convert trainIdx, nMatches and distance to vector with DMatch.
1402 static void radiusMatchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, const Mat &nMatches,
1403 std::vector< std::vector<DMatch> > &matches, bool compactResult = false);
1405 // Find best matches from train collection for each query descriptor which have distance less than
1406 // maxDistance (in increasing order of distances).
1407 void radiusMatch(const oclMat &query, std::vector< std::vector<DMatch> > &matches, float maxDistance,
1408 const std::vector<oclMat> &masks = std::vector<oclMat>(), bool compactResult = false);
1413 std::vector<oclMat> trainDescCollection;
1416 template <class Distance>
1417 class CV_EXPORTS BruteForceMatcher_OCL;
1419 template <typename T>
1420 class CV_EXPORTS BruteForceMatcher_OCL< L1<T> > : public BruteForceMatcher_OCL_base
1423 explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L1Dist) {}
1424 explicit BruteForceMatcher_OCL(L1<T> /*d*/) : BruteForceMatcher_OCL_base(L1Dist) {}
1426 template <typename T>
1427 class CV_EXPORTS BruteForceMatcher_OCL< L2<T> > : public BruteForceMatcher_OCL_base
1430 explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L2Dist) {}
1431 explicit BruteForceMatcher_OCL(L2<T> /*d*/) : BruteForceMatcher_OCL_base(L2Dist) {}
1433 template <> class CV_EXPORTS BruteForceMatcher_OCL< Hamming > : public BruteForceMatcher_OCL_base
1436 explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(HammingDist) {}
1437 explicit BruteForceMatcher_OCL(Hamming /*d*/) : BruteForceMatcher_OCL_base(HammingDist) {}
1440 class CV_EXPORTS BFMatcher_OCL : public BruteForceMatcher_OCL_base
1443 explicit BFMatcher_OCL(int norm = NORM_L2) : BruteForceMatcher_OCL_base(norm == NORM_L1 ? L1Dist : norm == NORM_L2 ? L2Dist : HammingDist) {}
1446 class CV_EXPORTS GoodFeaturesToTrackDetector_OCL
1449 explicit GoodFeaturesToTrackDetector_OCL(int maxCorners = 1000, double qualityLevel = 0.01, double minDistance = 0.0,
1450 int blockSize = 3, bool useHarrisDetector = false, double harrisK = 0.04);
1452 //! return 1 rows matrix with CV_32FC2 type
1453 void operator ()(const oclMat& image, oclMat& corners, const oclMat& mask = oclMat());
1454 //! download points of type Point2f to a vector. the vector's content will be erased
1455 void downloadPoints(const oclMat &points, std::vector<Point2f> &points_v);
1458 double qualityLevel;
1462 bool useHarrisDetector;
1464 void releaseMemory()
1469 minMaxbuf_.release();
1470 tmpCorners_.release();
1480 inline GoodFeaturesToTrackDetector_OCL::GoodFeaturesToTrackDetector_OCL(int maxCorners_, double qualityLevel_, double minDistance_,
1481 int blockSize_, bool useHarrisDetector_, double harrisK_)
1483 maxCorners = maxCorners_;
1484 qualityLevel = qualityLevel_;
1485 minDistance = minDistance_;
1486 blockSize = blockSize_;
1487 useHarrisDetector = useHarrisDetector_;
1491 ////////////////////////////////// FAST Feature Detector //////////////////////////////////
1492 class CV_EXPORTS FAST_OCL
1503 // all features have same size
1504 static const int FEATURE_SIZE = 7;
1506 explicit FAST_OCL(int threshold, bool nonmaxSupression = true, double keypointsRatio = 0.05);
1508 //! finds the keypoints using FAST detector
1509 //! supports only CV_8UC1 images
1510 void operator ()(const oclMat& image, const oclMat& mask, oclMat& keypoints);
1511 void operator ()(const oclMat& image, const oclMat& mask, std::vector<KeyPoint>& keypoints);
1513 //! download keypoints from device to host memory
1514 static void downloadKeypoints(const oclMat& d_keypoints, std::vector<KeyPoint>& keypoints);
1516 //! convert keypoints to KeyPoint vector
1517 static void convertKeypoints(const Mat& h_keypoints, std::vector<KeyPoint>& keypoints);
1519 //! release temporary buffer's memory
1522 bool nonmaxSupression;
1526 //! max keypoints = keypointsRatio * img.size().area()
1527 double keypointsRatio;
1529 //! find keypoints and compute it's response if nonmaxSupression is true
1530 //! return count of detected keypoints
1531 int calcKeyPointsLocation(const oclMat& image, const oclMat& mask);
1533 //! get final array of keypoints
1534 //! performs nonmax supression if needed
1535 //! return final count of keypoints
1536 int getKeyPoints(oclMat& keypoints);
1544 oclMat d_keypoints_;
1546 int calcKeypointsOCL(const oclMat& img, const oclMat& mask, int maxKeypoints);
1547 int nonmaxSupressionOCL(oclMat& keypoints);
1550 /////////////////////////////// PyrLKOpticalFlow /////////////////////////////////////
1552 class CV_EXPORTS PyrLKOpticalFlow
1557 winSize = Size(21, 21);
1561 useInitialFlow = false;
1562 minEigThreshold = 1e-4f;
1563 getMinEigenVals = false;
1564 isDeviceArch11_ = false;
1567 void sparse(const oclMat &prevImg, const oclMat &nextImg, const oclMat &prevPts, oclMat &nextPts,
1568 oclMat &status, oclMat *err = 0);
1570 void dense(const oclMat &prevImg, const oclMat &nextImg, oclMat &u, oclMat &v, oclMat *err = 0);
1576 bool useInitialFlow;
1577 float minEigThreshold;
1578 bool getMinEigenVals;
1580 void releaseMemory()
1582 dx_calcBuf_.release();
1583 dy_calcBuf_.release();
1593 void calcSharrDeriv(const oclMat &src, oclMat &dx, oclMat &dy);
1595 void buildImagePyramid(const oclMat &img0, std::vector<oclMat> &pyr, bool withBorder);
1600 std::vector<oclMat> prevPyr_;
1601 std::vector<oclMat> nextPyr_;
1609 bool isDeviceArch11_;
1612 class CV_EXPORTS FarnebackOpticalFlow
1615 FarnebackOpticalFlow();
1626 void operator ()(const oclMat &frame0, const oclMat &frame1, oclMat &flowx, oclMat &flowy);
1628 void releaseMemory();
1631 void prepareGaussian(
1632 int n, double sigma, float *g, float *xg, float *xxg,
1633 double &ig11, double &ig03, double &ig33, double &ig55);
1635 void setPolynomialExpansionConsts(int n, double sigma);
1637 void updateFlow_boxFilter(
1638 const oclMat& R0, const oclMat& R1, oclMat& flowx, oclMat &flowy,
1639 oclMat& M, oclMat &bufM, int blockSize, bool updateMatrices);
1641 void updateFlow_gaussianBlur(
1642 const oclMat& R0, const oclMat& R1, oclMat& flowx, oclMat& flowy,
1643 oclMat& M, oclMat &bufM, int blockSize, bool updateMatrices);
1646 oclMat pyrLevel_[2], M_, bufM_, R_[2], blurredFrame_[2];
1647 std::vector<oclMat> pyramid0_, pyramid1_;
1650 //////////////// build warping maps ////////////////////
1651 //! builds plane warping maps
1652 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);
1653 //! builds cylindrical warping maps
1654 CV_EXPORTS void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale, oclMat &map_x, oclMat &map_y);
1655 //! builds spherical warping maps
1656 CV_EXPORTS void buildWarpSphericalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale, oclMat &map_x, oclMat &map_y);
1657 //! builds Affine warping maps
1658 CV_EXPORTS void buildWarpAffineMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap);
1660 //! builds Perspective warping maps
1661 CV_EXPORTS void buildWarpPerspectiveMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap);
1663 ///////////////////////////////////// interpolate frames //////////////////////////////////////////////
1664 //! Interpolate frames (images) using provided optical flow (displacement field).
1665 //! frame0 - frame 0 (32-bit floating point images, single channel)
1666 //! frame1 - frame 1 (the same type and size)
1667 //! fu - forward horizontal displacement
1668 //! fv - forward vertical displacement
1669 //! bu - backward horizontal displacement
1670 //! bv - backward vertical displacement
1671 //! pos - new frame position
1672 //! newFrame - new frame
1673 //! buf - temporary buffer, will have width x 6*height size, CV_32FC1 type and contain 6 oclMat;
1674 //! occlusion masks 0, occlusion masks 1,
1675 //! interpolated forward flow 0, interpolated forward flow 1,
1676 //! interpolated backward flow 0, interpolated backward flow 1
1678 CV_EXPORTS void interpolateFrames(const oclMat &frame0, const oclMat &frame1,
1679 const oclMat &fu, const oclMat &fv,
1680 const oclMat &bu, const oclMat &bv,
1681 float pos, oclMat &newFrame, oclMat &buf);
1683 //! computes moments of the rasterized shape or a vector of points
1684 //! _array should be a vector a points standing for the contour
1685 CV_EXPORTS Moments ocl_moments(InputArray contour);
1686 //! src should be a general image uploaded to the GPU.
1687 //! the supported oclMat type are CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1 and CV_64FC1
1688 //! to use type of CV_64FC1, the GPU should support CV_64FC1
1689 CV_EXPORTS Moments ocl_moments(oclMat& src, bool binary);
1691 class CV_EXPORTS StereoBM_OCL
1694 enum { BASIC_PRESET = 0, PREFILTER_XSOBEL = 1 };
1696 enum { DEFAULT_NDISP = 64, DEFAULT_WINSZ = 19 };
1698 //! the default constructor
1700 //! the full constructor taking the camera-specific preset, number of disparities and the SAD window size. ndisparities must be multiple of 8.
1701 StereoBM_OCL(int preset, int ndisparities = DEFAULT_NDISP, int winSize = DEFAULT_WINSZ);
1703 //! the stereo correspondence operator. Finds the disparity for the specified rectified stereo pair
1704 //! Output disparity has CV_8U type.
1705 void operator() ( const oclMat &left, const oclMat &right, oclMat &disparity);
1707 //! Some heuristics that tries to estmate
1708 // if current GPU will be faster then CPU in this algorithm.
1709 // It queries current active device.
1710 static bool checkIfGpuCallReasonable();
1716 // If avergeTexThreshold == 0 => post procesing is disabled
1717 // If avergeTexThreshold != 0 then disparity is set 0 in each point (x,y) where for left image
1718 // SumOfHorizontalGradiensInWindow(x, y, winSize) < (winSize * winSize) * avergeTexThreshold
1719 // i.e. input left image is low textured.
1720 float avergeTexThreshold;
1722 oclMat minSSD, leBuf, riBuf;
1725 class CV_EXPORTS StereoBeliefPropagation
1728 enum { DEFAULT_NDISP = 64 };
1729 enum { DEFAULT_ITERS = 5 };
1730 enum { DEFAULT_LEVELS = 5 };
1731 static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels);
1732 explicit StereoBeliefPropagation(int ndisp = DEFAULT_NDISP,
1733 int iters = DEFAULT_ITERS,
1734 int levels = DEFAULT_LEVELS,
1735 int msg_type = CV_16S);
1736 StereoBeliefPropagation(int ndisp, int iters, int levels,
1737 float max_data_term, float data_weight,
1738 float max_disc_term, float disc_single_jump,
1739 int msg_type = CV_32F);
1740 void operator()(const oclMat &left, const oclMat &right, oclMat &disparity);
1741 void operator()(const oclMat &data, oclMat &disparity);
1745 float max_data_term;
1747 float max_disc_term;
1748 float disc_single_jump;
1751 oclMat u, d, l, r, u2, d2, l2, r2;
1752 std::vector<oclMat> datas;
1756 class CV_EXPORTS StereoConstantSpaceBP
1759 enum { DEFAULT_NDISP = 128 };
1760 enum { DEFAULT_ITERS = 8 };
1761 enum { DEFAULT_LEVELS = 4 };
1762 enum { DEFAULT_NR_PLANE = 4 };
1763 static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels, int &nr_plane);
1764 explicit StereoConstantSpaceBP(
1765 int ndisp = DEFAULT_NDISP,
1766 int iters = DEFAULT_ITERS,
1767 int levels = DEFAULT_LEVELS,
1768 int nr_plane = DEFAULT_NR_PLANE,
1769 int msg_type = CV_32F);
1770 StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane,
1771 float max_data_term, float data_weight, float max_disc_term, float disc_single_jump,
1772 int min_disp_th = 0,
1773 int msg_type = CV_32F);
1774 void operator()(const oclMat &left, const oclMat &right, oclMat &disparity);
1779 float max_data_term;
1781 float max_disc_term;
1782 float disc_single_jump;
1785 bool use_local_init_data_cost;
1787 oclMat u[2], d[2], l[2], r[2];
1788 oclMat disp_selected_pyr[2];
1790 oclMat data_cost_selected;
1795 // Implementation of the Zach, Pock and Bischof Dual TV-L1 Optical Flow method
1798 // [1] C. Zach, T. Pock and H. Bischof, "A Duality Based Approach for Realtime TV-L1 Optical Flow".
1799 // [2] Javier Sanchez, Enric Meinhardt-Llopis and Gabriele Facciolo. "TV-L1 Optical Flow Estimation".
1800 class CV_EXPORTS OpticalFlowDual_TVL1_OCL
1803 OpticalFlowDual_TVL1_OCL();
1805 void operator ()(const oclMat& I0, const oclMat& I1, oclMat& flowx, oclMat& flowy);
1807 void collectGarbage();
1810 * Time step of the numerical scheme.
1815 * Weight parameter for the data term, attachment parameter.
1816 * This is the most relevant parameter, which determines the smoothness of the output.
1817 * The smaller this parameter is, the smoother the solutions we obtain.
1818 * It depends on the range of motions of the images, so its value should be adapted to each image sequence.
1823 * Weight parameter for (u - v)^2, tightness parameter.
1824 * It serves as a link between the attachment and the regularization terms.
1825 * In theory, it should have a small value in order to maintain both parts in correspondence.
1826 * The method is stable for a large range of values of this parameter.
1831 * Number of scales used to create the pyramid of images.
1836 * Number of warpings per scale.
1837 * Represents the number of times that I1(x+u0) and grad( I1(x+u0) ) are computed per scale.
1838 * This is a parameter that assures the stability of the method.
1839 * It also affects the running time, so it is a compromise between speed and accuracy.
1844 * Stopping criterion threshold used in the numerical scheme, which is a trade-off between precision and running time.
1845 * A small value will yield more accurate solutions at the expense of a slower convergence.
1850 * Stopping criterion iterations number used in the numerical scheme.
1854 bool useInitialFlow;
1857 void procOneScale(const oclMat& I0, const oclMat& I1, oclMat& u1, oclMat& u2);
1859 std::vector<oclMat> I0s;
1860 std::vector<oclMat> I1s;
1861 std::vector<oclMat> u1s;
1862 std::vector<oclMat> u2s;
1882 // current supported sorting methods
1885 SORT_BITONIC, // only support power-of-2 buffer size
1886 SORT_SELECTION, // cannot sort duplicate keys
1888 SORT_RADIX // only support signed int/float keys(CV_32S/CV_32F)
1890 //! Returns the sorted result of all the elements in input based on equivalent keys.
1892 // The element unit in the values to be sorted is determined from the data type,
1893 // i.e., a CV_32FC2 input {a1a2, b1b2} will be considered as two elements, regardless its
1894 // matrix dimension.
1895 // both keys and values will be sorted inplace
1896 // Key needs to be single channel oclMat.
1900 // keys = {2, 3, 1} (CV_8UC1)
1901 // values = {10,5, 4,3, 6,2} (CV_8UC2)
1902 // sortByKey(keys, values, SORT_SELECTION, false);
1904 // keys = {1, 2, 3} (CV_8UC1)
1905 // values = {6,2, 10,5, 4,3} (CV_8UC2)
1906 CV_EXPORTS void sortByKey(oclMat& keys, oclMat& values, int method, bool isGreaterThan = false);
1907 /*!Base class for MOG and MOG2!*/
1908 class CV_EXPORTS BackgroundSubtractor
1911 //! the virtual destructor
1912 virtual ~BackgroundSubtractor();
1913 //! the update operator that takes the next video frame and returns the current foreground mask as 8-bit binary image.
1914 virtual void operator()(const oclMat& image, oclMat& fgmask, float learningRate);
1916 //! computes a background image
1917 virtual void getBackgroundImage(oclMat& backgroundImage) const = 0;
1920 Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm
1922 The class implements the following algorithm:
1923 "An improved adaptive background mixture model for real-time tracking with shadow detection"
1924 P. KadewTraKuPong and R. Bowden,
1925 Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001."
1926 http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
1928 class CV_EXPORTS MOG: public cv::ocl::BackgroundSubtractor
1931 //! the default constructor
1932 MOG(int nmixtures = -1);
1934 //! re-initiaization method
1935 void initialize(Size frameSize, int frameType);
1937 //! the update operator
1938 void operator()(const oclMat& frame, oclMat& fgmask, float learningRate = 0.f);
1940 //! computes a background image which are the mean of all background gaussians
1941 void getBackgroundImage(oclMat& backgroundImage) const;
1943 //! releases all inner buffers
1948 float backgroundRatio;
1965 The class implements the following algorithm:
1966 "Improved adaptive Gausian mixture model for background subtraction"
1968 International Conference Pattern Recognition, UK, August, 2004.
1969 http://www.zoranz.net/Publications/zivkovic2004ICPR.pdf
1971 class CV_EXPORTS MOG2: public cv::ocl::BackgroundSubtractor
1974 //! the default constructor
1975 MOG2(int nmixtures = -1);
1977 //! re-initiaization method
1978 void initialize(Size frameSize, int frameType);
1980 //! the update operator
1981 void operator()(const oclMat& frame, oclMat& fgmask, float learningRate = -1.0f);
1983 //! computes a background image which are the mean of all background gaussians
1984 void getBackgroundImage(oclMat& backgroundImage) const;
1986 //! releases all inner buffers
1990 // you should call initialize after parameters changes
1994 //! here it is the maximum allowed number of mixture components.
1995 //! Actual number is determined dynamically per pixel
1997 // threshold on the squared Mahalanobis distance to decide if it is well described
1998 // by the background model or not. Related to Cthr from the paper.
1999 // This does not influence the update of the background. A typical value could be 4 sigma
2000 // and that is varThreshold=4*4=16; Corresponds to Tb in the paper.
2002 /////////////////////////
2003 // less important parameters - things you might change but be carefull
2004 ////////////////////////
2006 float backgroundRatio;
2007 // corresponds to fTB=1-cf from the paper
2008 // TB - threshold when the component becomes significant enough to be included into
2009 // the background model. It is the TB=1-cf from the paper. So I use cf=0.1 => TB=0.
2010 // For alpha=0.001 it means that the mode should exist for approximately 105 frames before
2011 // it is considered foreground
2012 // float noiseSigma;
2013 float varThresholdGen;
2015 //correspondts to Tg - threshold on the squared Mahalan. dist. to decide
2016 //when a sample is close to the existing components. If it is not close
2017 //to any a new component will be generated. I use 3 sigma => Tg=3*3=9.
2018 //Smaller Tg leads to more generated components and higher Tg might make
2019 //lead to small number of components but they can grow too large
2024 //initial variance for the newly generated components.
2025 //It will will influence the speed of adaptation. A good guess should be made.
2026 //A simple way is to estimate the typical standard deviation from the images.
2027 //I used here 10 as a reasonable value
2028 // min and max can be used to further control the variance
2029 float fCT; //CT - complexity reduction prior
2030 //this is related to the number of samples needed to accept that a component
2031 //actually exists. We use CT=0.05 of all the samples. By setting CT=0 you get
2032 //the standard Stauffer&Grimson algorithm (maybe not exact but very similar)
2034 //shadow detection parameters
2035 bool bShadowDetection; //default 1 - do shadow detection
2036 unsigned char nShadowDetection; //do shadow detection - insert this value as the detection result - 127 default value
2038 // Tau - shadow threshold. The shadow is detected if the pixel is darker
2039 //version of the background. Tau is a threshold on how much darker the shadow can be.
2040 //Tau= 0.5 means that if pixel is more than 2 times darker then it is not shadow
2041 //See: Prati,Mikic,Trivedi,Cucchiarra,"Detecting Moving Shadows...",IEEE PAMI,2003.
2054 oclMat bgmodelUsedModes_; //keep track of number of modes per pixel
2057 /*!***************Kalman Filter*************!*/
2058 class CV_EXPORTS KalmanFilter
2062 //! the full constructor taking the dimensionality of the state, of the measurement and of the control vector
2063 KalmanFilter(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F);
2064 //! re-initializes Kalman filter. The previous content is destroyed.
2065 void init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F);
2067 const oclMat& predict(const oclMat& control=oclMat());
2068 const oclMat& correct(const oclMat& measurement);
2070 oclMat statePre; //!< predicted state (x'(k)): x(k)=A*x(k-1)+B*u(k)
2071 oclMat statePost; //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k))
2072 oclMat transitionMatrix; //!< state transition matrix (A)
2073 oclMat controlMatrix; //!< control matrix (B) (not used if there is no control)
2074 oclMat measurementMatrix; //!< measurement matrix (H)
2075 oclMat processNoiseCov; //!< process noise covariance matrix (Q)
2076 oclMat measurementNoiseCov;//!< measurement noise covariance matrix (R)
2077 oclMat errorCovPre; //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/
2078 oclMat gain; //!< Kalman gain matrix (K(k)): K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)
2079 oclMat errorCovPost; //!< posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k)
2088 /*!***************K Nearest Neighbour*************!*/
2089 class CV_EXPORTS KNearestNeighbour: public CvKNearest
2092 KNearestNeighbour();
2093 ~KNearestNeighbour();
2095 bool train(const Mat& trainData, Mat& labels, Mat& sampleIdx = Mat().setTo(Scalar::all(0)),
2096 bool isRegression = false, int max_k = 32, bool updateBase = false);
2100 void find_nearest(const oclMat& samples, int k, oclMat& lables);
2106 /*!*************** SVM *************!*/
2107 class CV_EXPORTS CvSVM_OCL : public CvSVM
2112 CvSVM_OCL(const cv::Mat& trainData, const cv::Mat& responses,
2113 const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(),
2114 CvSVMParams params=CvSVMParams());
2115 CV_WRAP float predict( const int row_index, Mat& src, bool returnDFVal=false ) const;
2116 CV_WRAP void predict( cv::InputArray samples, cv::OutputArray results ) const;
2117 CV_WRAP float predict( const cv::Mat& sample, bool returnDFVal=false ) const;
2118 float predict( const CvMat* samples, CV_OUT CvMat* results ) const;
2121 float predict( const int row_index, int row_len, Mat& src, bool returnDFVal=false ) const;
2122 void create_kernel();
2123 void create_solver();
2126 /*!*************** END *************!*/
2129 #if defined _MSC_VER && _MSC_VER >= 1200
2130 # pragma warning( push)
2131 # pragma warning( disable: 4267)
2133 #include "opencv2/ocl/matrix_operations.hpp"
2134 #if defined _MSC_VER && _MSC_VER >= 1200
2135 # pragma warning( pop)
2138 #endif /* __OPENCV_OCL_HPP__ */