1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "perf_precomp.hpp"
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace std;
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace cv;
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace perf;
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing std::tr1::make_tuple;
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing std::tr1::get;
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_ENUM(MethodType, TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED)
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef std::tr1::tuple<Size, Size, MethodType> ImgSize_TmplSize_Method_t;
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef perf::TestBaseWithParam<ImgSize_TmplSize_Method_t> ImgSize_TmplSize_Method;
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPERF_TEST_P(ImgSize_TmplSize_Method, matchTemplateSmall,
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            testing::Combine(
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                testing::Values(szSmall128, cv::Size(320, 240),
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                cv::Size(640, 480), cv::Size(800, 600),
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                cv::Size(1024, 768), cv::Size(1280, 1024)),
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                testing::Values(cv::Size(12, 12), cv::Size(28, 9),
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                cv::Size(8, 30), cv::Size(16, 16)),
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                MethodType::all()
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                )
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            )
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Size imgSz = get<0>(GetParam());
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Size tmplSz = get<1>(GetParam());
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int method = get<2>(GetParam());
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat img(imgSz, CV_8UC1);
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat tmpl(tmplSz, CV_8UC1);
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat result(imgSz - tmplSz + Size(1,1), CV_32F);
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    declare
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .in(img, WARMUP_RNG)
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .in(tmpl, WARMUP_RNG)
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .out(result)
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .time(30);
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_CYCLE() matchTemplate(img, tmpl, result, method);
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool isNormed =
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_CCORR_NORMED ||
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_SQDIFF_NORMED ||
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_CCOEFF_NORMED;
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double eps = isNormed ? 1e-5
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        : 255 * 255 * tmpl.total() * 1e-6;
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SANITY_CHECK(result, eps);
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPERF_TEST_P(ImgSize_TmplSize_Method, matchTemplateBig,
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            testing::Combine(
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                testing::Values(cv::Size(1280, 1024)),
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                testing::Values(cv::Size(1260, 1000), cv::Size(1261, 1013)),
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                MethodType::all()
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                )
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    )
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Size imgSz = get<0>(GetParam());
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Size tmplSz = get<1>(GetParam());
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int method = get<2>(GetParam());
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat img(imgSz, CV_8UC1);
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat tmpl(tmplSz, CV_8UC1);
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat result(imgSz - tmplSz + Size(1,1), CV_32F);
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    declare
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .in(img, WARMUP_RNG)
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .in(tmpl, WARMUP_RNG)
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .out(result)
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .time(30);
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_CYCLE() matchTemplate(img, tmpl, result, method);
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool isNormed =
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_CCORR_NORMED ||
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_SQDIFF_NORMED ||
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        method == TM_CCOEFF_NORMED;
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double eps = isNormed ? 1e-6
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        : 255.0 * 255.0 * (double)tmpl.total() * 1e-6;
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SANITY_CHECK(result, eps);
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
84