Merge commit '43aec5ad' into merge-2.4
[profile/ivi/opencv.git] / modules / ocl / perf / perf_match_template.cpp
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) 2010-2012, Multicoreware, Inc., all rights reserved.
14 // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // @Authors
18 //    Fangfang Bai, fangfang@multicorewareinc.com
19 //    Jin Ma,       jin@multicorewareinc.com
20 //
21 // Redistribution and use in source and binary forms, with or without modification,
22 // are permitted provided that the following conditions are met:
23 //
24 //   * Redistribution's of source code must retain the above copyright notice,
25 //     this list of conditions and the following disclaimer.
26 //
27 //   * Redistribution's in binary form must reproduce the above copyright notice,
28 //     this list of conditions and the following disclaimer in the documentation
29 //     and/or other oclMaterials provided with the distribution.
30 //
31 //   * The name of the copyright holders may not be used to endorse or promote products
32 //     derived from this software without specific prior written permission.
33 //
34 // This software is provided by the copyright holders and contributors as is and
35 // any express or implied warranties, including, but not limited to, the implied
36 // warranties of merchantability and fitness for a particular purpose are disclaimed.
37 // In no event shall the Intel Corporation or contributors be liable for any direct,
38 // indirect, incidental, special, exemplary, or consequential damages
39 // (including, but not limited to, procurement of substitute goods or services;
40 // loss of use, data, or profits; or business interruption) however caused
41 // and on any theory of liability, whether in contract, strict liability,
42 // or tort (including negligence or otherwise) arising in any way out of
43 // the use of this software, even if advised of the possibility of such damage.
44 //
45 //M*/
46 #include "perf_precomp.hpp"
47
48 /////////// matchTemplate ////////////////////////
49 //void InitMatchTemplate()
50 //{
51 //      Mat src; gen(src, 500, 500, CV_32F, 0, 1);
52 //      Mat templ; gen(templ, 500, 500, CV_32F, 0, 1);
53 //      ocl::oclMat d_src(src), d_templ(templ), d_dst;
54 //      ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);
55 //}
56 PERFTEST(matchTemplate)
57 {
58     //InitMatchTemplate();
59     Mat src, templ, dst, ocl_dst;
60     int templ_size = 5;
61
62     for (int size = Min_Size; size <= Max_Size; size *= Multiple)
63     {
64         int all_type[] = {CV_32FC1, CV_32FC4};
65         std::string type_name[] = {"CV_32FC1", "CV_32FC4"};
66
67         for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
68         {
69             for(templ_size = 5; templ_size <= 5; templ_size *= 5)
70             {
71                 gen(src, size, size, all_type[j], 0, 1);
72
73                 SUBTEST << src.cols << 'x' << src.rows << "; " << type_name[j] << "; templ " << templ_size << 'x' << templ_size << "; CCORR";
74
75                 gen(templ, templ_size, templ_size, all_type[j], 0, 1);
76
77                 matchTemplate(src, templ, dst, TM_CCORR);
78
79                 CPU_ON;
80                 matchTemplate(src, templ, dst, TM_CCORR);
81                 CPU_OFF;
82
83                 ocl::oclMat d_src(src), d_templ(templ), d_dst;
84
85                 WARMUP_ON;
86                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR);
87                 WARMUP_OFF;
88
89                 GPU_ON;
90                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR);
91                 GPU_OFF;
92
93                 GPU_FULL_ON;
94                 d_src.upload(src);
95                 d_templ.upload(templ);
96                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR);
97                 d_dst.download(ocl_dst);
98                 GPU_FULL_OFF;
99
100                 TestSystem::instance().ExpectedMatNear(dst, ocl_dst, templ.rows * templ.cols * 1e-1);
101             }
102         }
103
104         int all_type_8U[] = {CV_8UC1};
105         std::string type_name_8U[] = {"CV_8UC1"};
106
107         for (size_t j = 0; j < sizeof(all_type_8U) / sizeof(int); j++)
108         {
109             for(templ_size = 5; templ_size <= 5; templ_size *= 5)
110             {
111                 SUBTEST << src.cols << 'x' << src.rows << "; " << type_name_8U[j] << "; templ " << templ_size << 'x' << templ_size << "; CCORR_NORMED";
112
113                 gen(src, size, size, all_type_8U[j], 0, 255);
114
115                 gen(templ, templ_size, templ_size, all_type_8U[j], 0, 255);
116
117                 matchTemplate(src, templ, dst, TM_CCORR_NORMED);
118
119                 CPU_ON;
120                 matchTemplate(src, templ, dst, TM_CCORR_NORMED);
121                 CPU_OFF;
122
123                 ocl::oclMat d_src(src);
124                 ocl::oclMat d_templ(templ), d_dst;
125
126                 WARMUP_ON;
127                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR_NORMED);
128                 WARMUP_OFF;
129
130                 GPU_ON;
131                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR_NORMED);
132                 GPU_OFF;
133
134                 GPU_FULL_ON;
135                 d_src.upload(src);
136                 d_templ.upload(templ);
137                 ocl::matchTemplate(d_src, d_templ, d_dst, TM_CCORR_NORMED);
138                 d_dst.download(ocl_dst);
139                 GPU_FULL_OFF;
140
141                 TestSystem::instance().ExpectedMatNear(dst, ocl_dst, templ.rows * templ.cols * 1e-1);
142             }
143         }
144     }
145 }