reduce.hpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  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) 2000-2008, Intel Corporation, all rights reserved.
  14. // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
  15. // Copyright (C) 2013, OpenCV Foundation, 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. #pragma once
  44. #ifndef OPENCV_CUDEV_GRID_REDUCE_HPP
  45. #define OPENCV_CUDEV_GRID_REDUCE_HPP
  46. #include <limits>
  47. #include "../common.hpp"
  48. #include "../ptr2d/traits.hpp"
  49. #include "../ptr2d/gpumat.hpp"
  50. #include "../ptr2d/mask.hpp"
  51. #include "../ptr2d/transform.hpp"
  52. #include "detail/reduce.hpp"
  53. #include "detail/minmaxloc.hpp"
  54. namespace cv { namespace cudev {
  55. //! @addtogroup cudev
  56. //! @{
  57. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  58. __host__ void gridCalcSum_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  59. {
  60. typedef typename PtrTraits<SrcPtr>::value_type src_type;
  61. CV_StaticAssert( unsigned(VecTraits<src_type>::cn) == unsigned(VecTraits<ResType>::cn), "" );
  62. dst.create(1, 1);
  63. dst.setTo(0, stream);
  64. const int rows = getRows(src);
  65. const int cols = getCols(src);
  66. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  67. grid_reduce_detail::sum<Policy>(shrinkPtr(src),
  68. dst[0],
  69. shrinkPtr(mask),
  70. rows, cols,
  71. StreamAccessor::getStream(stream));
  72. }
  73. template <class Policy, class SrcPtr, typename ResType>
  74. __host__ void gridCalcSum_(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  75. {
  76. typedef typename PtrTraits<SrcPtr>::value_type src_type;
  77. CV_StaticAssert( unsigned(VecTraits<src_type>::cn) == unsigned(VecTraits<ResType>::cn), "" );
  78. dst.create(1, 1);
  79. dst.setTo(0, stream);
  80. const int rows = getRows(src);
  81. const int cols = getCols(src);
  82. grid_reduce_detail::sum<Policy>(shrinkPtr(src),
  83. dst[0],
  84. WithOutMask(),
  85. rows, cols,
  86. StreamAccessor::getStream(stream));
  87. }
  88. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  89. __host__ void gridFindMinVal_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  90. {
  91. dst.create(1, 1);
  92. dst.setTo(Scalar::all(std::numeric_limits<ResType>::max()), stream);
  93. const int rows = getRows(src);
  94. const int cols = getCols(src);
  95. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  96. grid_reduce_detail::minVal<Policy>(shrinkPtr(src),
  97. dst[0],
  98. shrinkPtr(mask),
  99. rows, cols,
  100. StreamAccessor::getStream(stream));
  101. }
  102. template <class Policy, class SrcPtr, typename ResType>
  103. __host__ void gridFindMinVal_(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  104. {
  105. dst.create(1, 1);
  106. dst.setTo(Scalar::all(std::numeric_limits<ResType>::max()), stream);
  107. const int rows = getRows(src);
  108. const int cols = getCols(src);
  109. grid_reduce_detail::minVal<Policy>(shrinkPtr(src),
  110. dst[0],
  111. WithOutMask(),
  112. rows, cols,
  113. StreamAccessor::getStream(stream));
  114. }
  115. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  116. __host__ void gridFindMaxVal_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  117. {
  118. dst.create(1, 1);
  119. dst.setTo(Scalar::all(-std::numeric_limits<ResType>::max()), stream);
  120. const int rows = getRows(src);
  121. const int cols = getCols(src);
  122. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  123. grid_reduce_detail::maxVal<Policy>(shrinkPtr(src),
  124. dst[0],
  125. shrinkPtr(mask),
  126. rows, cols,
  127. StreamAccessor::getStream(stream));
  128. }
  129. template <class Policy, class SrcPtr, typename ResType>
  130. __host__ void gridFindMaxVal_(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  131. {
  132. dst.create(1, 1);
  133. dst.setTo(Scalar::all(-std::numeric_limits<ResType>::max()), stream);
  134. const int rows = getRows(src);
  135. const int cols = getCols(src);
  136. grid_reduce_detail::maxVal<Policy>(shrinkPtr(src),
  137. dst[0],
  138. WithOutMask(),
  139. rows, cols,
  140. StreamAccessor::getStream(stream));
  141. }
  142. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  143. __host__ void gridFindMinMaxVal_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  144. {
  145. dst.create(1, 2);
  146. dst.col(0).setTo(Scalar::all(std::numeric_limits<ResType>::max()), stream);
  147. dst.col(1).setTo(Scalar::all(-std::numeric_limits<ResType>::max()), stream);
  148. const int rows = getRows(src);
  149. const int cols = getCols(src);
  150. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  151. grid_reduce_detail::minMaxVal<Policy>(shrinkPtr(src),
  152. dst[0],
  153. shrinkPtr(mask),
  154. rows, cols,
  155. StreamAccessor::getStream(stream));
  156. }
  157. template <class Policy, class SrcPtr, typename ResType>
  158. __host__ void gridFindMinMaxVal_(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  159. {
  160. dst.create(1, 2);
  161. dst.col(0).setTo(Scalar::all(std::numeric_limits<ResType>::max()), stream);
  162. dst.col(1).setTo(Scalar::all(-std::numeric_limits<ResType>::max()), stream);
  163. const int rows = getRows(src);
  164. const int cols = getCols(src);
  165. grid_reduce_detail::minMaxVal<Policy>(shrinkPtr(src),
  166. dst[0],
  167. WithOutMask(),
  168. rows, cols,
  169. StreamAccessor::getStream(stream));
  170. }
  171. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  172. __host__ void gridMinMaxLoc_(const SrcPtr& src, GpuMat_<ResType>& valBuf, GpuMat_<int>& locBuf, const MaskPtr& mask, Stream& stream = Stream::Null())
  173. {
  174. const int rows = getRows(src);
  175. const int cols = getCols(src);
  176. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  177. dim3 grid, block;
  178. grid_minmaxloc_detail::getLaunchCfg<Policy>(rows, cols, block, grid);
  179. valBuf.create(2, grid.x * grid.y);
  180. locBuf.create(2, grid.x * grid.y);
  181. grid_minmaxloc_detail::minMaxLoc<Policy>(shrinkPtr(src),
  182. valBuf[0], valBuf[1], locBuf[0], locBuf[1],
  183. shrinkPtr(mask),
  184. rows, cols,
  185. StreamAccessor::getStream(stream));
  186. }
  187. template <class Policy, class SrcPtr, typename ResType>
  188. __host__ void gridMinMaxLoc_(const SrcPtr& src, GpuMat_<ResType>& valBuf, GpuMat_<int>& locBuf, Stream& stream = Stream::Null())
  189. {
  190. const int rows = getRows(src);
  191. const int cols = getCols(src);
  192. dim3 grid, block;
  193. grid_minmaxloc_detail::getLaunchCfg<Policy>(rows, cols, block, grid);
  194. valBuf.create(2, grid.x * grid.y);
  195. locBuf.create(2, grid.x * grid.y);
  196. grid_minmaxloc_detail::minMaxLoc<Policy>(shrinkPtr(src),
  197. valBuf[0], valBuf[1], locBuf[0], locBuf[1],
  198. WithOutMask(),
  199. rows, cols,
  200. StreamAccessor::getStream(stream));
  201. }
  202. template <class Policy, class SrcPtr, typename ResType, class MaskPtr>
  203. __host__ void gridCountNonZero_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  204. {
  205. dst.create(1, 1);
  206. dst.setTo(0, stream);
  207. const int rows = getRows(src);
  208. const int cols = getCols(src);
  209. CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
  210. typedef typename PtrTraits<SrcPtr>::value_type src_type;
  211. not_equal_to<src_type> ne_op;
  212. const src_type zero = VecTraits<src_type>::all(0);
  213. grid_reduce_detail::sum<Policy>(shrinkPtr(transformPtr(src, bind2nd(ne_op, zero))),
  214. dst[0],
  215. shrinkPtr(mask),
  216. rows, cols,
  217. StreamAccessor::getStream(stream));
  218. }
  219. template <class Policy, class SrcPtr, typename ResType>
  220. __host__ void gridCountNonZero_(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  221. {
  222. dst.create(1, 1);
  223. dst.setTo(0, stream);
  224. const int rows = getRows(src);
  225. const int cols = getCols(src);
  226. typedef typename PtrTraits<SrcPtr>::value_type src_type;
  227. not_equal_to<src_type> ne_op;
  228. const src_type zero = VecTraits<src_type>::all(0);
  229. grid_reduce_detail::sum<Policy>(shrinkPtr(transformPtr(src, bind2nd(ne_op, zero))),
  230. dst[0],
  231. WithOutMask(),
  232. rows, cols,
  233. StreamAccessor::getStream(stream));
  234. }
  235. // default policy
  236. struct DefaultGlobReducePolicy
  237. {
  238. enum {
  239. block_size_x = 32,
  240. block_size_y = 8,
  241. patch_size_x = 4,
  242. patch_size_y = 4
  243. };
  244. };
  245. template <class SrcPtr, typename ResType, class MaskPtr>
  246. __host__ void gridCalcSum(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  247. {
  248. gridCalcSum_<DefaultGlobReducePolicy>(src, dst, mask, stream);
  249. }
  250. template <class SrcPtr, typename ResType>
  251. __host__ void gridCalcSum(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  252. {
  253. gridCalcSum_<DefaultGlobReducePolicy>(src, dst, stream);
  254. }
  255. template <class SrcPtr, typename ResType, class MaskPtr>
  256. __host__ void gridFindMinVal(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  257. {
  258. gridFindMinVal_<DefaultGlobReducePolicy>(src, dst, mask, stream);
  259. }
  260. template <class SrcPtr, typename ResType>
  261. __host__ void gridFindMinVal(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  262. {
  263. gridFindMinVal_<DefaultGlobReducePolicy>(src, dst, stream);
  264. }
  265. template <class SrcPtr, typename ResType, class MaskPtr>
  266. __host__ void gridFindMaxVal(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  267. {
  268. gridFindMaxVal_<DefaultGlobReducePolicy>(src, dst, mask, stream);
  269. }
  270. template <class SrcPtr, typename ResType>
  271. __host__ void gridFindMaxVal(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  272. {
  273. gridFindMaxVal_<DefaultGlobReducePolicy>(src, dst, stream);
  274. }
  275. template <class SrcPtr, typename ResType, class MaskPtr>
  276. __host__ void gridFindMinMaxVal(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  277. {
  278. gridFindMinMaxVal_<DefaultGlobReducePolicy>(src, dst, mask, stream);
  279. }
  280. template <class SrcPtr, typename ResType>
  281. __host__ void gridFindMinMaxVal(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  282. {
  283. gridFindMinMaxVal_<DefaultGlobReducePolicy>(src, dst, stream);
  284. }
  285. template <class SrcPtr, typename ResType, class MaskPtr>
  286. __host__ void gridMinMaxLoc(const SrcPtr& src, GpuMat_<ResType>& valBuf, GpuMat_<int>& locBuf, const MaskPtr& mask, Stream& stream = Stream::Null())
  287. {
  288. gridMinMaxLoc_<DefaultGlobReducePolicy>(src, valBuf, locBuf, mask, stream);
  289. }
  290. template <class SrcPtr, typename ResType>
  291. __host__ void gridMinMaxLoc(const SrcPtr& src, GpuMat_<ResType>& valBuf, GpuMat_<int>& locBuf, Stream& stream = Stream::Null())
  292. {
  293. gridMinMaxLoc_<DefaultGlobReducePolicy>(src, valBuf, locBuf, stream);
  294. }
  295. template <class SrcPtr, typename ResType, class MaskPtr>
  296. __host__ void gridCountNonZero(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
  297. {
  298. gridCountNonZero_<DefaultGlobReducePolicy>(src, dst, mask, stream);
  299. }
  300. template <class SrcPtr, typename ResType>
  301. __host__ void gridCountNonZero(const SrcPtr& src, GpuMat_<ResType>& dst, Stream& stream = Stream::Null())
  302. {
  303. gridCountNonZero_<DefaultGlobReducePolicy>(src, dst, stream);
  304. }
  305. //! @}
  306. }}
  307. #endif