test_filters.cpp 17.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                        Intel License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of Intel Corporation may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

42
#include "precomp.hpp"
43

44 45 46
namespace {

IMPLEMENT_PARAM_CLASS(KSize, cv::Size)
47

48 49 50 51 52
cv::Mat getInnerROI(cv::InputArray m_, cv::Size ksize)
{
    cv::Mat m = getMat(m_);
    cv::Rect roi(ksize.width, ksize.height, m.cols - 2 * ksize.width, m.rows - 2 * ksize.height);
    return m(roi);
53 54
}

55 56 57 58
cv::Mat getInnerROI(cv::InputArray m, int ksize)
{
    return getInnerROI(m, cv::Size(ksize, ksize));
}
59

60
/////////////////////////////////////////////////////////////////////////////////////////////////
61 62 63
// Blur

IMPLEMENT_PARAM_CLASS(Anchor, cv::Point)
64

65
PARAM_TEST_CASE(Blur, cv::gpu::DeviceInfo, cv::Size, MatType, KSize, Anchor, UseRoi)
66 67
{
    cv::gpu::DeviceInfo devInfo;
68 69
    cv::Size size;
    int type;
70
    cv::Size ksize;
71
    cv::Point anchor;
72
    bool useRoi;
73 74

    virtual void SetUp()
75
    {
76
        devInfo = GET_PARAM(0);
77 78 79 80 81
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        ksize = GET_PARAM(3);
        anchor = GET_PARAM(4);
        useRoi = GET_PARAM(5);
82 83

        cv::gpu::setDevice(devInfo.deviceID());
84
    }
85 86
};

87
TEST_P(Blur, Accuracy)
88
{
89
    cv::Mat src = randomMat(size, type);
90

91 92
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::blur(loadMat(src, useRoi), dst, ksize, anchor);
93

94
    cv::Mat dst_gold;
95
    cv::blur(src, dst_gold, ksize, anchor);
96

97
    EXPECT_MAT_NEAR(getInnerROI(dst_gold, ksize), getInnerROI(dst, ksize), 1.0);
98 99
}

100 101
INSTANTIATE_TEST_CASE_P(GPU_Filter, Blur, testing::Combine(
    ALL_DEVICES,
102 103
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
104
    testing::Values(KSize(cv::Size(3, 3)), KSize(cv::Size(5, 5)), KSize(cv::Size(7, 7))),
105 106
    testing::Values(Anchor(cv::Point(-1, -1)), Anchor(cv::Point(0, 0)), Anchor(cv::Point(2, 2))),
    WHOLE_SUBMAT));
107 108

/////////////////////////////////////////////////////////////////////////////////////////////////
109
// Sobel
110

111 112 113
IMPLEMENT_PARAM_CLASS(Deriv_X, int)
IMPLEMENT_PARAM_CLASS(Deriv_Y, int)

114
PARAM_TEST_CASE(Sobel, cv::gpu::DeviceInfo, cv::Size, MatType, KSize, Deriv_X, Deriv_Y, BorderType, UseRoi)
115
{
116
    cv::gpu::DeviceInfo devInfo;
117 118
    cv::Size size;
    int type;
119
    cv::Size ksize;
120 121
    int dx;
    int dy;
122
    int borderType;
123
    bool useRoi;
124 125

    virtual void SetUp()
126
    {
127
        devInfo = GET_PARAM(0);
128 129 130 131 132 133 134
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        ksize = GET_PARAM(3);
        dx = GET_PARAM(4);
        dy = GET_PARAM(5);
        borderType = GET_PARAM(6);
        useRoi = GET_PARAM(7);
135

136 137 138 139
        cv::gpu::setDevice(devInfo.deviceID());
    }
};

140
TEST_P(Sobel, Accuracy)
141 142 143 144
{
    if (dx == 0 && dy == 0)
        return;

145
    cv::Mat src = randomMat(size, type);
146

147 148
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::Sobel(loadMat(src, useRoi), dst, -1, dx, dy, ksize.width, 1.0, borderType);
149

150
    cv::Mat dst_gold;
151
    cv::Sobel(src, dst_gold, -1, dx, dy, ksize.width, 1.0, 0.0, borderType);
152

153
    EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
154 155
}

156 157
INSTANTIATE_TEST_CASE_P(GPU_Filter, Sobel, testing::Combine(
    ALL_DEVICES,
158 159
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
160
    testing::Values(KSize(cv::Size(3, 3)), KSize(cv::Size(5, 5)), KSize(cv::Size(7, 7))),
161 162 163 164 165 166 167
    testing::Values(Deriv_X(0), Deriv_X(1), Deriv_X(2)),
    testing::Values(Deriv_Y(0), Deriv_Y(1), Deriv_Y(2)),
    testing::Values(BorderType(cv::BORDER_REFLECT101),
                    BorderType(cv::BORDER_REPLICATE),
                    BorderType(cv::BORDER_CONSTANT),
                    BorderType(cv::BORDER_REFLECT)),
    WHOLE_SUBMAT));
168

169
/////////////////////////////////////////////////////////////////////////////////////////////////
170
// Scharr
171

172
PARAM_TEST_CASE(Scharr, cv::gpu::DeviceInfo, cv::Size, MatType, Deriv_X, Deriv_Y, BorderType, UseRoi)
173 174
{
    cv::gpu::DeviceInfo devInfo;
175 176
    cv::Size size;
    int type;
177 178
    int dx;
    int dy;
179
    int borderType;
180
    bool useRoi;
181

182 183
    virtual void SetUp()
    {
184
        devInfo = GET_PARAM(0);
185 186 187 188 189 190
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        dx = GET_PARAM(3);
        dy = GET_PARAM(4);
        borderType = GET_PARAM(5);
        useRoi = GET_PARAM(6);
191 192

        cv::gpu::setDevice(devInfo.deviceID());
193 194 195
    }
};

196
TEST_P(Scharr, Accuracy)
197 198 199 200
{
    if (dx + dy != 1)
        return;

201
    cv::Mat src = randomMat(size, type);
202

203 204
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::Scharr(loadMat(src, useRoi), dst, -1, dx, dy, 1.0, borderType);
205

206
    cv::Mat dst_gold;
207
    cv::Scharr(src, dst_gold, -1, dx, dy, 1.0, 0.0, borderType);
208

209
    EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
210
}
211

212 213
INSTANTIATE_TEST_CASE_P(GPU_Filter, Scharr, testing::Combine(
    ALL_DEVICES,
214 215
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
216 217 218 219 220 221 222
    testing::Values(Deriv_X(0), Deriv_X(1)),
    testing::Values(Deriv_Y(0), Deriv_Y(1)),
    testing::Values(BorderType(cv::BORDER_REFLECT101),
                    BorderType(cv::BORDER_REPLICATE),
                    BorderType(cv::BORDER_CONSTANT),
                    BorderType(cv::BORDER_REFLECT)),
    WHOLE_SUBMAT));
223

224
/////////////////////////////////////////////////////////////////////////////////////////////////
225
// GaussianBlur
226

227
PARAM_TEST_CASE(GaussianBlur, cv::gpu::DeviceInfo, cv::Size, MatType, KSize, BorderType, UseRoi)
228
{
229
    cv::gpu::DeviceInfo devInfo;
230 231
    cv::Size size;
    int type;
232
    cv::Size ksize;
233
    int borderType;
234
    bool useRoi;
235 236

    virtual void SetUp()
237
    {
238
        devInfo = GET_PARAM(0);
239 240 241 242 243
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        ksize = GET_PARAM(3);
        borderType = GET_PARAM(4);
        useRoi = GET_PARAM(5);
244

245
        cv::gpu::setDevice(devInfo.deviceID());
246 247 248
    }
};

249
TEST_P(GaussianBlur, Accuracy)
250
{
251 252 253
    cv::Mat src = randomMat(size, type);
    double sigma1 = randomDouble(0.1, 1.0);
    double sigma2 = randomDouble(0.1, 1.0);
254

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
    if (ksize.height > 16 && !supportFeature(devInfo, cv::gpu::FEATURE_SET_COMPUTE_20))
    {
        try
        {
            cv::gpu::GpuMat dst;
            cv::gpu::GaussianBlur(loadMat(src), dst, ksize, sigma1, sigma2, borderType);
        }
        catch (const cv::Exception& e)
        {
            ASSERT_EQ(CV_StsNotImplemented, e.code);
        }
    }
    else
    {
        cv::gpu::GpuMat dst = createMat(size, type, useRoi);
        cv::gpu::GaussianBlur(loadMat(src, useRoi), dst, ksize, sigma1, sigma2, borderType);
271

272 273
        cv::Mat dst_gold;
        cv::GaussianBlur(src, dst_gold, ksize, sigma1, sigma2, borderType);
274

275 276
        EXPECT_MAT_NEAR(dst_gold, dst, 4.0);
    }
277 278
}

279 280
INSTANTIATE_TEST_CASE_P(GPU_Filter, GaussianBlur, testing::Combine(
    ALL_DEVICES,
281 282
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
    testing::Values(KSize(cv::Size(3, 3)),
                    KSize(cv::Size(5, 5)),
                    KSize(cv::Size(7, 7)),
                    KSize(cv::Size(9, 9)),
                    KSize(cv::Size(11, 11)),
                    KSize(cv::Size(13, 13)),
                    KSize(cv::Size(15, 15)),
                    KSize(cv::Size(17, 17)),
                    KSize(cv::Size(19, 19)),
                    KSize(cv::Size(21, 21)),
                    KSize(cv::Size(23, 23)),
                    KSize(cv::Size(25, 25)),
                    KSize(cv::Size(27, 27)),
                    KSize(cv::Size(29, 29)),
                    KSize(cv::Size(31, 31))),
298 299 300 301 302
    testing::Values(BorderType(cv::BORDER_REFLECT101),
                    BorderType(cv::BORDER_REPLICATE),
                    BorderType(cv::BORDER_CONSTANT),
                    BorderType(cv::BORDER_REFLECT)),
    WHOLE_SUBMAT));
303

304
/////////////////////////////////////////////////////////////////////////////////////////////////
305
// Laplacian
306

307
PARAM_TEST_CASE(Laplacian, cv::gpu::DeviceInfo, cv::Size, MatType, KSize, UseRoi)
308 309
{
    cv::gpu::DeviceInfo devInfo;
310 311
    cv::Size size;
    int type;
312
    cv::Size ksize;
313
    bool useRoi;
314 315 316

    virtual void SetUp()
    {
317
        devInfo = GET_PARAM(0);
318 319 320 321
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        ksize = GET_PARAM(3);
        useRoi = GET_PARAM(4);
322

323
        cv::gpu::setDevice(devInfo.deviceID());
324 325 326
    }
};

327
TEST_P(Laplacian, Accuracy)
328
{
329
    cv::Mat src = randomMat(size, type);
330

331
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
332 333 334 335 336
    cv::gpu::Laplacian(loadMat(src, useRoi), dst, -1, ksize.width);

    cv::Mat dst_gold;
    cv::Laplacian(src, dst_gold, -1, ksize.width);

337 338 339 340
    if (type == CV_32FC1)
        EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
    else
        EXPECT_MAT_NEAR(getInnerROI(dst_gold, cv::Size(3, 3)), getInnerROI(dst, cv::Size(3, 3)), 0.0);
341 342
}

343 344
INSTANTIATE_TEST_CASE_P(GPU_Filter, Laplacian, testing::Combine(
    ALL_DEVICES,
345 346
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4), MatType(CV_32FC1)),
347
    testing::Values(KSize(cv::Size(1, 1)), KSize(cv::Size(3, 3))),
348
    WHOLE_SUBMAT));
349 350

/////////////////////////////////////////////////////////////////////////////////////////////////
351
// Erode
352

353 354
IMPLEMENT_PARAM_CLASS(Iterations, int)

355
PARAM_TEST_CASE(Erode, cv::gpu::DeviceInfo, cv::Size, MatType, Anchor, Iterations, UseRoi)
356
{
357
    cv::gpu::DeviceInfo devInfo;
358 359
    cv::Size size;
    int type;
360 361
    cv::Point anchor;
    int iterations;
362
    bool useRoi;
363 364

    virtual void SetUp()
365
    {
366
        devInfo = GET_PARAM(0);
367 368 369 370 371
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        anchor = GET_PARAM(3);
        iterations = GET_PARAM(4);
        useRoi = GET_PARAM(5);
372

373
        cv::gpu::setDevice(devInfo.deviceID());
374 375 376
    }
};

377
TEST_P(Erode, Accuracy)
378
{
379 380
    cv::Mat src = randomMat(size, type);
    cv::Mat kernel = cv::Mat::ones(3, 3, CV_8U);
381

382 383
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::erode(loadMat(src, useRoi), dst, kernel, anchor, iterations);
384

385
    cv::Mat dst_gold;
386
    cv::erode(src, dst_gold, kernel, anchor, iterations);
387

388
    cv::Size ksize = cv::Size(kernel.cols + iterations * (kernel.cols - 1), kernel.rows + iterations * (kernel.rows - 1));
389

390
    EXPECT_MAT_NEAR(getInnerROI(dst_gold, ksize), getInnerROI(dst, ksize), 0.0);
391 392
}

393 394
INSTANTIATE_TEST_CASE_P(GPU_Filter, Erode, testing::Combine(
    ALL_DEVICES,
395 396
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
397 398 399
    testing::Values(Anchor(cv::Point(-1, -1)), Anchor(cv::Point(0, 0)), Anchor(cv::Point(2, 2))),
    testing::Values(Iterations(1), Iterations(2), Iterations(3)),
    WHOLE_SUBMAT));
400 401

/////////////////////////////////////////////////////////////////////////////////////////////////
402
// Dilate
403

404
PARAM_TEST_CASE(Dilate, cv::gpu::DeviceInfo, cv::Size, MatType, Anchor, Iterations, UseRoi)
405
{
406
    cv::gpu::DeviceInfo devInfo;
407 408
    cv::Size size;
    int type;
409 410
    cv::Point anchor;
    int iterations;
411
    bool useRoi;
412 413

    virtual void SetUp()
414
    {
415
        devInfo = GET_PARAM(0);
416 417 418 419 420
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        anchor = GET_PARAM(3);
        iterations = GET_PARAM(4);
        useRoi = GET_PARAM(5);
421

422
        cv::gpu::setDevice(devInfo.deviceID());
423 424 425
    }
};

426
TEST_P(Dilate, Accuracy)
427
{
428 429
    cv::Mat src = randomMat(size, type);
    cv::Mat kernel = cv::Mat::ones(3, 3, CV_8U);
430

431 432
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::dilate(loadMat(src, useRoi), dst, kernel, anchor, iterations);
433

434
    cv::Mat dst_gold;
435
    cv::dilate(src, dst_gold, kernel, anchor, iterations);
436

437
    cv::Size ksize = cv::Size(kernel.cols + iterations * (kernel.cols - 1), kernel.rows + iterations * (kernel.rows - 1));
438

439
    EXPECT_MAT_NEAR(getInnerROI(dst_gold, ksize), getInnerROI(dst, ksize), 0.0);
440 441
}

442 443
INSTANTIATE_TEST_CASE_P(GPU_Filter, Dilate, testing::Combine(
    ALL_DEVICES,
444 445
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
446 447 448
    testing::Values(Anchor(cv::Point(-1, -1)), Anchor(cv::Point(0, 0)), Anchor(cv::Point(2, 2))),
    testing::Values(Iterations(1), Iterations(2), Iterations(3)),
    WHOLE_SUBMAT));
449

450
/////////////////////////////////////////////////////////////////////////////////////////////////
451 452 453 454
// MorphEx

CV_ENUM(MorphOp, cv::MORPH_OPEN, cv::MORPH_CLOSE, cv::MORPH_GRADIENT, cv::MORPH_TOPHAT, cv::MORPH_BLACKHAT)
#define ALL_MORPH_OPS testing::Values(MorphOp(cv::MORPH_OPEN), MorphOp(cv::MORPH_CLOSE), MorphOp(cv::MORPH_GRADIENT), MorphOp(cv::MORPH_TOPHAT), MorphOp(cv::MORPH_BLACKHAT))
455

456
PARAM_TEST_CASE(MorphEx, cv::gpu::DeviceInfo, cv::Size, MatType, MorphOp, Anchor, Iterations, UseRoi)
457 458
{
    cv::gpu::DeviceInfo devInfo;
459 460
    cv::Size size;
    int type;
461
    int morphOp;
462 463
    cv::Point anchor;
    int iterations;
464
    bool useRoi;
465

466 467
    virtual void SetUp()
    {
468
        devInfo = GET_PARAM(0);
469 470 471 472 473 474
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        morphOp = GET_PARAM(3);
        anchor = GET_PARAM(4);
        iterations = GET_PARAM(5);
        useRoi = GET_PARAM(6);
475 476

        cv::gpu::setDevice(devInfo.deviceID());
477 478 479
    }
};

480
TEST_P(MorphEx, Accuracy)
481
{
482 483
    cv::Mat src = randomMat(size, type);
    cv::Mat kernel = cv::Mat::ones(3, 3, CV_8U);
484

485 486
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
    cv::gpu::morphologyEx(loadMat(src, useRoi), dst, morphOp, kernel, anchor, iterations);
487

488
    cv::Mat dst_gold;
489
    cv::morphologyEx(src, dst_gold, morphOp, kernel, anchor, iterations);
490

491
    cv::Size border = cv::Size(kernel.cols + (iterations + 1) * kernel.cols + 2, kernel.rows + (iterations + 1) * kernel.rows + 2);
492

493
    EXPECT_MAT_NEAR(getInnerROI(dst_gold, border), getInnerROI(dst, border), 0.0);
494 495
}

496 497
INSTANTIATE_TEST_CASE_P(GPU_Filter, MorphEx, testing::Combine(
    ALL_DEVICES,
498 499
    DIFFERENT_SIZES,
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
500 501 502 503
    ALL_MORPH_OPS,
    testing::Values(Anchor(cv::Point(-1, -1)), Anchor(cv::Point(0, 0)), Anchor(cv::Point(2, 2))),
    testing::Values(Iterations(1), Iterations(2), Iterations(3)),
    WHOLE_SUBMAT));
504

505
/////////////////////////////////////////////////////////////////////////////////////////////////
506
// Filter2D
507

V
Vladislav Vinogradov 已提交
508
PARAM_TEST_CASE(Filter2D, cv::gpu::DeviceInfo, cv::Size, MatType, KSize, Anchor, BorderType, UseRoi)
509 510
{
    cv::gpu::DeviceInfo devInfo;
511 512
    cv::Size size;
    int type;
513 514
    cv::Size ksize;
    cv::Point anchor;
V
Vladislav Vinogradov 已提交
515
    int borderType;
516 517 518 519
    bool useRoi;

    cv::Mat img;
    cv::Mat kernel;
520

521 522 523
    virtual void SetUp()
    {
        devInfo = GET_PARAM(0);
524 525 526 527
        size = GET_PARAM(1);
        type = GET_PARAM(2);
        ksize = GET_PARAM(3);
        anchor = GET_PARAM(4);
V
Vladislav Vinogradov 已提交
528 529
        borderType = GET_PARAM(5);
        useRoi = GET_PARAM(6);
530 531 532 533 534

        cv::gpu::setDevice(devInfo.deviceID());
    }
};

535
TEST_P(Filter2D, Accuracy)
536
{
537
    cv::Mat src = randomMat(size, type);
V
Vladislav Vinogradov 已提交
538
    cv::Mat kernel = randomMat(cv::Size(ksize.width, ksize.height), CV_32FC1, 0.0, 1.0);
539

540
    cv::gpu::GpuMat dst = createMat(size, type, useRoi);
V
Vladislav Vinogradov 已提交
541
    cv::gpu::filter2D(loadMat(src, useRoi), dst, -1, kernel, anchor, borderType);
542

543
    cv::Mat dst_gold;
V
Vladislav Vinogradov 已提交
544
    cv::filter2D(src, dst_gold, -1, kernel, anchor, 0, borderType);
545

V
Vladislav Vinogradov 已提交
546
    EXPECT_MAT_NEAR(dst_gold, dst, CV_MAT_DEPTH(type) == CV_32F ? 1e-1 : 1.0);
547 548
}

549 550
INSTANTIATE_TEST_CASE_P(GPU_Filter, Filter2D, testing::Combine(
    ALL_DEVICES,
551
    DIFFERENT_SIZES,
V
Vladislav Vinogradov 已提交
552
    testing::Values(MatType(CV_8UC1), MatType(CV_8UC4), MatType(CV_16UC1), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC4)),
553
    testing::Values(KSize(cv::Size(3, 3)), KSize(cv::Size(5, 5)), KSize(cv::Size(7, 7)), KSize(cv::Size(11, 11)), KSize(cv::Size(13, 13)), KSize(cv::Size(15, 15))),
554
    testing::Values(Anchor(cv::Point(-1, -1)), Anchor(cv::Point(0, 0)), Anchor(cv::Point(2, 2))),
V
Vladislav Vinogradov 已提交
555
    testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT)),
556
    WHOLE_SUBMAT));
557 558

} // namespace