Added perf test for remap
[profile/ivi/opencv.git] / modules / imgproc / perf / perf_warp.cpp
1 #include "perf_precomp.hpp"\r
2 \r
3 using namespace std;\r
4 using namespace cv;\r
5 using namespace perf;\r
6 using namespace testing;\r
7 using std::tr1::make_tuple;\r
8 using std::tr1::get;\r
9 \r
10 enum{HALF_SIZE=0, UPSIDE_DOWN, REFLECTION_X, REFLECTION_BOTH};\r
11 \r
12 CV_ENUM(BorderMode, BORDER_CONSTANT, BORDER_REPLICATE);\r
13 CV_ENUM(InterType, INTER_NEAREST, INTER_LINEAR);\r
14 CV_ENUM(RemapMode, HALF_SIZE, UPSIDE_DOWN, REFLECTION_X, REFLECTION_BOTH);\r
15 \r
16 typedef TestBaseWithParam< tr1::tuple<Size, InterType, BorderMode> > TestWarpAffine;\r
17 typedef TestBaseWithParam< tr1::tuple<Size, InterType, BorderMode> > TestWarpPerspective;\r
18 typedef TestBaseWithParam< tr1::tuple<MatType, Size, InterType, BorderMode, RemapMode> > TestRemap;\r
19 \r
20 void update_map(const Mat& src, Mat& map_x, Mat& map_y, const int remapMode );\r
21 \r
22 PERF_TEST_P( TestWarpAffine, WarpAffine,\r
23              Combine(\r
24                 Values( szVGA, sz720p, sz1080p ),\r
25                 ValuesIn( InterType::all() ),\r
26                 ValuesIn( BorderMode::all() )\r
27              )\r
28 )\r
29 {\r
30     Size sz;\r
31     int borderMode, interType;\r
32     sz         = get<0>(GetParam());\r
33     borderMode = get<1>(GetParam());\r
34     interType  = get<2>(GetParam());\r
35 \r
36     Mat src, img = imread(getDataPath("cv/shared/fruits.jpg"));\r
37     cvtColor(img, src, COLOR_BGR2RGBA, 4);\r
38     Mat warpMat = getRotationMatrix2D(Point2f(src.cols/2.f, src.rows/2.f), 30., 2.2);\r
39     Mat dst(sz, CV_8UC4);\r
40 \r
41     declare.in(src).out(dst);\r
42 \r
43     TEST_CYCLE() warpAffine( src, dst, warpMat, sz, interType, borderMode, Scalar::all(150) );\r
44 \r
45     SANITY_CHECK(dst);\r
46 \r
47 }\r
48 \r
49 PERF_TEST_P( TestWarpPerspective, WarpPerspective,\r
50              Combine(\r
51                 Values( szVGA, sz720p, sz1080p ),\r
52                 ValuesIn( InterType::all() ),\r
53                 ValuesIn( BorderMode::all() )\r
54              )\r
55 )\r
56 {\r
57     Size sz;\r
58     int borderMode, interType;\r
59     sz         = get<0>(GetParam());\r
60     borderMode = get<1>(GetParam());\r
61     interType  = get<2>(GetParam());\r
62 \r
63 \r
64     Mat src, img = imread(getDataPath("cv/shared/fruits.jpg"));\r
65     cvtColor(img, src, COLOR_BGR2RGBA, 4);\r
66     Mat rotMat = getRotationMatrix2D(Point2f(src.cols/2.f, src.rows/2.f), 30., 2.2);\r
67     Mat warpMat(3, 3, CV_64FC1);\r
68     for(int r=0; r<2; r++)\r
69         for(int c=0; c<3; c++)\r
70             warpMat.at<double>(r, c) = rotMat.at<double>(r, c);\r
71     warpMat.at<double>(2, 0) = .3/sz.width;\r
72     warpMat.at<double>(2, 1) = .3/sz.height;\r
73     warpMat.at<double>(2, 2) = 1;\r
74     Mat dst(sz, CV_8UC4);\r
75 \r
76     declare.in(src).out(dst);\r
77 \r
78     TEST_CYCLE() warpPerspective( src, dst, warpMat, sz, interType, borderMode, Scalar::all(150) );\r
79 \r
80     SANITY_CHECK(dst);\r
81 }\r
82 \r
83 PERF_TEST_P( TestRemap, remap,\r
84              Combine(\r
85                  Values( TYPICAL_MAT_TYPES ),\r
86                  Values( szVGA, sz720p, sz1080p ),\r
87                  ValuesIn( InterType::all() ),\r
88                  ValuesIn( BorderMode::all() ),\r
89                  ValuesIn( RemapMode::all() )\r
90                  )\r
91              )\r
92 {\r
93     int type = get<0>(GetParam());\r
94     Size size = get<1>(GetParam());\r
95     int interpolationType = get<2>(GetParam());\r
96     int borderMode = get<3>(GetParam());\r
97     int remapMode = get<4>(GetParam());\r
98     unsigned int height = size.height;\r
99     unsigned int width = size.width;\r
100     Mat source(height, width, type);\r
101     Mat destination;\r
102     Mat map_x(height, width, CV_32F);\r
103     Mat map_y(height, width, CV_32F);\r
104 \r
105     declare.in(source, WARMUP_RNG);\r
106 \r
107     update_map(source, map_x, map_y, remapMode);\r
108 \r
109     TEST_CYCLE()\r
110     {\r
111         remap(source, destination, map_x, map_y, interpolationType, borderMode);\r
112     }\r
113 \r
114     SANITY_CHECK(destination, 1);\r
115 }\r
116 \r
117 void update_map(const Mat& src, Mat& map_x, Mat& map_y, const int remapMode )\r
118 {\r
119     for( int j = 0; j < src.rows; j++ )\r
120     {\r
121         for( int i = 0; i < src.cols; i++ )\r
122         {\r
123             switch( remapMode )\r
124             {\r
125             case HALF_SIZE:\r
126                 if( i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75 )\r
127                 {\r
128                     map_x.at<float>(j,i) = 2*( i - src.cols*0.25 ) + 0.5 ;\r
129                     map_y.at<float>(j,i) = 2*( j - src.rows*0.25 ) + 0.5 ;\r
130                 }\r
131                 else\r
132                 {\r
133                     map_x.at<float>(j,i) = 0 ;\r
134                     map_y.at<float>(j,i) = 0 ;\r
135                 }\r
136                 break;\r
137             case UPSIDE_DOWN:\r
138                 map_x.at<float>(j,i) = i ;\r
139                 map_y.at<float>(j,i) = src.rows - j ;\r
140                 break;\r
141             case REFLECTION_X:\r
142                 map_x.at<float>(j,i) = src.cols - i ;\r
143                 map_y.at<float>(j,i) = j ;\r
144                 break;\r
145             case REFLECTION_BOTH:\r
146                 map_x.at<float>(j,i) = src.cols - i ;\r
147                 map_y.at<float>(j,i) = src.rows - j ;\r
148                 break;\r
149             } // end of switch\r
150         }\r
151     }\r
152 }\r
153 \r
154 PERF_TEST(Transform, getPerspectiveTransform)\r
155 {\r
156     unsigned int size = 8;\r
157     Mat source(1, size/2, CV_32FC2);\r
158     Mat destination(1, size/2, CV_32FC2);\r
159     Mat transformCoefficient;\r
160 \r
161     declare.in(source, destination, WARMUP_RNG);\r
162 \r
163     TEST_CYCLE()\r
164     {\r
165         transformCoefficient = getPerspectiveTransform(source, destination);\r
166     }\r
167 }\r
168 \r