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 44 #pragma once 45 46 #ifndef __OPENCV_CUDEV_GRID_SPLIT_MERGE_HPP__ 47 #define __OPENCV_CUDEV_GRID_SPLIT_MERGE_HPP__ 48 49 #include "../common.hpp" 50 #include "../util/tuple.hpp" 51 #include "../util/vec_traits.hpp" 52 #include "../ptr2d/traits.hpp" 53 #include "../ptr2d/gpumat.hpp" 54 #include "../ptr2d/glob.hpp" 55 #include "../ptr2d/mask.hpp" 56 #include "detail/split_merge.hpp" 57 58 namespace cv { namespace cudev { 59 60 //! @addtogroup cudev 61 //! @{ 62 63 template <class Policy, class SrcPtrTuple, typename DstType, class MaskPtr> 64 __host__ void gridMerge_(const SrcPtrTuple& src, GpuMat_<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 65 { 66 CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" ); 67 68 const int rows = getRows(src); 69 const int cols = getCols(src); 70 71 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 72 73 dst.create(rows, cols); 74 75 grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src), 76 shrinkPtr(dst), 77 shrinkPtr(mask), 78 rows, cols, 79 StreamAccessor::getStream(stream)); 80 } 81 82 template <class Policy, class SrcPtrTuple, typename DstType, class MaskPtr> 83 __host__ void gridMerge_(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 84 { 85 CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" ); 86 87 const int rows = getRows(src); 88 const int cols = getCols(src); 89 90 CV_Assert( getRows(dst) == rows && getCols(dst) == cols ); 91 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 92 93 grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src), 94 shrinkPtr(dst), 95 shrinkPtr(mask), 96 rows, cols, 97 StreamAccessor::getStream(stream)); 98 } 99 100 template <class Policy, class SrcPtrTuple, typename DstType> 101 __host__ void gridMerge_(const SrcPtrTuple& src, GpuMat_<DstType>& dst, Stream& stream = Stream::Null()) 102 { 103 CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" ); 104 105 const int rows = getRows(src); 106 const int cols = getCols(src); 107 108 dst.create(rows, cols); 109 110 grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src), 111 shrinkPtr(dst), 112 WithOutMask(), 113 rows, cols, 114 StreamAccessor::getStream(stream)); 115 } 116 117 template <class Policy, class SrcPtrTuple, typename DstType> 118 __host__ void gridMerge_(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, Stream& stream = Stream::Null()) 119 { 120 CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" ); 121 122 const int rows = getRows(src); 123 const int cols = getCols(src); 124 125 CV_Assert( getRows(dst) == rows && getCols(dst) == cols ); 126 127 grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src), 128 shrinkPtr(dst), 129 WithOutMask(), 130 rows, cols, 131 StreamAccessor::getStream(stream)); 132 } 133 134 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 135 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 136 { 137 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 138 139 const int rows = getRows(src); 140 const int cols = getCols(src); 141 142 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 143 144 get<0>(dst).create(rows, cols); 145 get<1>(dst).create(rows, cols); 146 147 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 148 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), 149 shrinkPtr(mask), 150 rows, cols, 151 StreamAccessor::getStream(stream)); 152 } 153 154 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 155 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[2], const MaskPtr& mask, Stream& stream = Stream::Null()) 156 { 157 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 158 159 const int rows = getRows(src); 160 const int cols = getCols(src); 161 162 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 163 164 dst[0].create(rows, cols); 165 dst[1].create(rows, cols); 166 167 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 168 shrinkPtr(dst[0]), shrinkPtr(dst[1]), 169 shrinkPtr(mask), 170 rows, cols, 171 StreamAccessor::getStream(stream)); 172 } 173 174 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 175 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[2], const MaskPtr& mask, Stream& stream = Stream::Null()) 176 { 177 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 178 179 const int rows = getRows(src); 180 const int cols = getCols(src); 181 182 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 183 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 184 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 185 186 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 187 shrinkPtr(dst[0]), shrinkPtr(dst[1]), 188 shrinkPtr(mask), 189 rows, cols, 190 StreamAccessor::getStream(stream)); 191 } 192 193 template <class Policy, class SrcPtr, typename DstType> 194 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 195 { 196 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 197 198 const int rows = getRows(src); 199 const int cols = getCols(src); 200 201 get<0>(dst).create(rows, cols); 202 get<1>(dst).create(rows, cols); 203 204 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 205 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), 206 WithOutMask(), 207 rows, cols, 208 StreamAccessor::getStream(stream)); 209 } 210 211 template <class Policy, class SrcPtr, typename DstType> 212 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[2], Stream& stream = Stream::Null()) 213 { 214 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 215 216 const int rows = getRows(src); 217 const int cols = getCols(src); 218 219 dst[0].create(rows, cols); 220 dst[1].create(rows, cols); 221 222 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 223 shrinkPtr(dst[0]), shrinkPtr(dst[1]), 224 WithOutMask(), 225 rows, cols, 226 StreamAccessor::getStream(stream)); 227 } 228 229 template <class Policy, class SrcPtr, typename DstType> 230 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[2], Stream& stream = Stream::Null()) 231 { 232 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 2, "" ); 233 234 const int rows = getRows(src); 235 const int cols = getCols(src); 236 237 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 238 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 239 240 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 241 shrinkPtr(dst[0]), shrinkPtr(dst[1]), 242 WithOutMask(), 243 rows, cols, 244 StreamAccessor::getStream(stream)); 245 } 246 247 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 248 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 249 { 250 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 251 252 const int rows = getRows(src); 253 const int cols = getCols(src); 254 255 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 256 257 get<0>(dst).create(rows, cols); 258 get<1>(dst).create(rows, cols); 259 get<2>(dst).create(rows, cols); 260 261 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 262 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), shrinkPtr(get<2>(dst)), 263 shrinkPtr(mask), 264 rows, cols, 265 StreamAccessor::getStream(stream)); 266 } 267 268 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 269 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[3], const MaskPtr& mask, Stream& stream = Stream::Null()) 270 { 271 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 272 273 const int rows = getRows(src); 274 const int cols = getCols(src); 275 276 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 277 278 dst[0].create(rows, cols); 279 dst[1].create(rows, cols); 280 dst[2].create(rows, cols); 281 282 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 283 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), 284 shrinkPtr(mask), 285 rows, cols, 286 StreamAccessor::getStream(stream)); 287 } 288 289 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 290 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[3], const MaskPtr& mask, Stream& stream = Stream::Null()) 291 { 292 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 293 294 const int rows = getRows(src); 295 const int cols = getCols(src); 296 297 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 298 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 299 CV_Assert( getRows(dst[2]) == rows && getCols(dst[2]) == cols ); 300 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 301 302 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 303 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), 304 shrinkPtr(mask), 305 rows, cols, 306 StreamAccessor::getStream(stream)); 307 } 308 309 template <class Policy, class SrcPtr, typename DstType> 310 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 311 { 312 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 313 314 const int rows = getRows(src); 315 const int cols = getCols(src); 316 317 get<0>(dst).create(rows, cols); 318 get<1>(dst).create(rows, cols); 319 get<2>(dst).create(rows, cols); 320 321 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 322 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), shrinkPtr(get<2>(dst)), 323 WithOutMask(), 324 rows, cols, 325 StreamAccessor::getStream(stream)); 326 } 327 328 template <class Policy, class SrcPtr, typename DstType> 329 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[3], Stream& stream = Stream::Null()) 330 { 331 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 332 333 const int rows = getRows(src); 334 const int cols = getCols(src); 335 336 dst[0].create(rows, cols); 337 dst[1].create(rows, cols); 338 dst[2].create(rows, cols); 339 340 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 341 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), 342 WithOutMask(), 343 rows, cols, 344 StreamAccessor::getStream(stream)); 345 } 346 347 template <class Policy, class SrcPtr, typename DstType> 348 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[3], Stream& stream = Stream::Null()) 349 { 350 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 3, "" ); 351 352 const int rows = getRows(src); 353 const int cols = getCols(src); 354 355 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 356 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 357 CV_Assert( getRows(dst[2]) == rows && getCols(dst[2]) == cols ); 358 359 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 360 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), 361 WithOutMask(), 362 rows, cols, 363 StreamAccessor::getStream(stream)); 364 } 365 366 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 367 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 368 { 369 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 370 371 const int rows = getRows(src); 372 const int cols = getCols(src); 373 374 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 375 376 get<0>(dst).create(rows, cols); 377 get<1>(dst).create(rows, cols); 378 get<2>(dst).create(rows, cols); 379 get<3>(dst).create(rows, cols); 380 381 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 382 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), shrinkPtr(get<2>(dst)), shrinkPtr(get<3>(dst)), 383 shrinkPtr(mask), 384 rows, cols, 385 StreamAccessor::getStream(stream)); 386 } 387 388 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 389 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[4], const MaskPtr& mask, Stream& stream = Stream::Null()) 390 { 391 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 392 393 const int rows = getRows(src); 394 const int cols = getCols(src); 395 396 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 397 398 dst[0].create(rows, cols); 399 dst[1].create(rows, cols); 400 dst[2].create(rows, cols); 401 dst[3].create(rows, cols); 402 403 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 404 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), shrinkPtr(dst[3]), 405 shrinkPtr(mask), 406 rows, cols, 407 StreamAccessor::getStream(stream)); 408 } 409 410 template <class Policy, class SrcPtr, typename DstType, class MaskPtr> 411 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[4], const MaskPtr& mask, Stream& stream = Stream::Null()) 412 { 413 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 414 415 const int rows = getRows(src); 416 const int cols = getCols(src); 417 418 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 419 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 420 CV_Assert( getRows(dst[2]) == rows && getCols(dst[2]) == cols ); 421 CV_Assert( getRows(dst[3]) == rows && getCols(dst[3]) == cols ); 422 CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); 423 424 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 425 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), shrinkPtr(dst[3]), 426 shrinkPtr(mask), 427 rows, cols, 428 StreamAccessor::getStream(stream)); 429 } 430 431 template <class Policy, class SrcPtr, typename DstType> 432 __host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 433 { 434 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 435 436 const int rows = getRows(src); 437 const int cols = getCols(src); 438 439 get<0>(dst).create(rows, cols); 440 get<1>(dst).create(rows, cols); 441 get<2>(dst).create(rows, cols); 442 get<3>(dst).create(rows, cols); 443 444 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 445 shrinkPtr(get<0>(dst)), shrinkPtr(get<1>(dst)), shrinkPtr(get<2>(dst)), shrinkPtr(get<3>(dst)), 446 WithOutMask(), 447 rows, cols, 448 StreamAccessor::getStream(stream)); 449 } 450 451 template <class Policy, class SrcPtr, typename DstType> 452 __host__ void gridSplit_(const SrcPtr& src, GpuMat_<DstType> (&dst)[4], Stream& stream = Stream::Null()) 453 { 454 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 455 456 const int rows = getRows(src); 457 const int cols = getCols(src); 458 459 dst[0].create(rows, cols); 460 dst[1].create(rows, cols); 461 dst[2].create(rows, cols); 462 dst[3].create(rows, cols); 463 464 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 465 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), shrinkPtr(dst[3]), 466 WithOutMask(), 467 rows, cols, 468 StreamAccessor::getStream(stream)); 469 } 470 471 template <class Policy, class SrcPtr, typename DstType> 472 __host__ void gridSplit_(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[4], Stream& stream = Stream::Null()) 473 { 474 CV_StaticAssert( VecTraits<typename PtrTraits<SrcPtr>::value_type>::cn == 4, "" ); 475 476 const int rows = getRows(src); 477 const int cols = getCols(src); 478 479 CV_Assert( getRows(dst[0]) == rows && getCols(dst[0]) == cols ); 480 CV_Assert( getRows(dst[1]) == rows && getCols(dst[1]) == cols ); 481 CV_Assert( getRows(dst[2]) == rows && getCols(dst[2]) == cols ); 482 CV_Assert( getRows(dst[3]) == rows && getCols(dst[3]) == cols ); 483 484 grid_split_merge_detail::split<Policy>(shrinkPtr(src), 485 shrinkPtr(dst[0]), shrinkPtr(dst[1]), shrinkPtr(dst[2]), shrinkPtr(dst[3]), 486 WithOutMask(), 487 rows, cols, 488 StreamAccessor::getStream(stream)); 489 } 490 491 // Default Policy 492 493 struct DefaultSplitMergePolicy 494 { 495 enum { 496 block_size_x = 32, 497 block_size_y = 8 498 }; 499 }; 500 501 template <class SrcPtrTuple, typename DstType, class MaskPtr> 502 __host__ void gridMerge(const SrcPtrTuple& src, GpuMat_<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 503 { 504 gridMerge_<DefaultSplitMergePolicy>(src, dst, mask, stream); 505 } 506 507 template <class SrcPtrTuple, typename DstType, class MaskPtr> 508 __host__ void gridMerge(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 509 { 510 gridMerge_<DefaultSplitMergePolicy>(src, dst, mask, stream); 511 } 512 513 template <class SrcPtrTuple, typename DstType> 514 __host__ void gridMerge(const SrcPtrTuple& src, GpuMat_<DstType>& dst, Stream& stream = Stream::Null()) 515 { 516 gridMerge_<DefaultSplitMergePolicy>(src, dst, stream); 517 } 518 519 template <class SrcPtrTuple, typename DstType> 520 __host__ void gridMerge(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, Stream& stream = Stream::Null()) 521 { 522 gridMerge_<DefaultSplitMergePolicy>(src, dst, stream); 523 } 524 525 template <class SrcPtr, typename DstType, class MaskPtr> 526 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 527 { 528 gridSplit_<DefaultSplitMergePolicy>(src, dst, mask, stream); 529 } 530 531 template <class SrcPtr, typename DstType> 532 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 533 { 534 gridSplit_<DefaultSplitMergePolicy>(src, dst, stream); 535 } 536 537 template <class SrcPtr, typename DstType, class MaskPtr> 538 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 539 { 540 gridSplit_<DefaultSplitMergePolicy>(src, dst, mask, stream); 541 } 542 543 template <class SrcPtr, typename DstType> 544 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 545 { 546 gridSplit_<DefaultSplitMergePolicy>(src, dst, stream); 547 } 548 549 template <class SrcPtr, typename DstType, class MaskPtr> 550 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null()) 551 { 552 gridSplit_<DefaultSplitMergePolicy>(src, dst, mask, stream); 553 } 554 555 template <class SrcPtr, typename DstType> 556 __host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, Stream& stream = Stream::Null()) 557 { 558 gridSplit_<DefaultSplitMergePolicy>(src, dst, stream); 559 } 560 561 template <class SrcPtr, typename DstType, int COUNT, class MaskPtr> 562 __host__ void gridSplit(const SrcPtr& src, GpuMat_<DstType> (&dst)[COUNT], const MaskPtr& mask, Stream& stream = Stream::Null()) 563 { 564 gridSplit_<DefaultSplitMergePolicy>(src, dst, mask, stream); 565 } 566 567 template <class SrcPtr, typename DstType, int COUNT, class MaskPtr> 568 __host__ void gridSplit(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[COUNT], const MaskPtr& mask, Stream& stream = Stream::Null()) 569 { 570 gridSplit_<DefaultSplitMergePolicy>(src, dst, mask, stream); 571 } 572 573 template <class SrcPtr, typename DstType, int COUNT> 574 __host__ void gridSplit(const SrcPtr& src, GpuMat_<DstType> (&dst)[COUNT], Stream& stream = Stream::Null()) 575 { 576 gridSplit_<DefaultSplitMergePolicy>(src, dst, stream); 577 } 578 579 template <class SrcPtr, typename DstType, int COUNT> 580 __host__ void gridSplit(const SrcPtr& src, GlobPtrSz<DstType> (&dst)[COUNT], Stream& stream = Stream::Null()) 581 { 582 gridSplit_<DefaultSplitMergePolicy>(src, dst, stream); 583 } 584 585 //! @} 586 587 }} 588 589 #endif 590