--- /dev/null
+#include "perf_precomp.hpp"
+
+using namespace std;
+using namespace cv;
+using namespace perf;
+using namespace testing;
+using std::tr1::make_tuple;
+using std::tr1::get;
+
+typedef TestBaseWithParam<Size > CreateHanningWindowFixture;
+
+PERF_TEST_P( CreateHanningWindowFixture, CreateHanningWindow, Values(szVGA, sz1080p))
+{
+ const Size size = GetParam();
+ Mat dst(size, CV_32FC1);
+
+ declare.in(dst, WARMUP_RNG).out(dst);
+
+ TEST_CYCLE() cv::createHanningWindow(dst, size, CV_32FC1);
+
+ SANITY_CHECK(dst, 1e-6, ERROR_RELATIVE);
+}
_dst.create(winSize, type);
Mat dst = _dst.getMat();
- int rows = dst.rows;
- int cols = dst.cols;
+ int rows = dst.rows, cols = dst.cols;
+
+ AutoBuffer<double> _wc(cols);
+ double * const wc = (double *)_wc;
+
+ double coeff0 = 2.0 * CV_PI / (double)(cols - 1), coeff1 = 2.0f * CV_PI / (double)(rows - 1);
+ for(int j = 0; j < cols; j++)
+ wc[j] = 0.5 * (1.0 - cos(coeff0 * j));
if(dst.depth() == CV_32F)
{
for(int i = 0; i < rows; i++)
{
float* dstData = dst.ptr<float>(i);
- double wr = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(rows - 1)));
+ double wr = 0.5 * (1.0 - cos(coeff1 * i));
for(int j = 0; j < cols; j++)
- {
- double wc = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)j / (double)(cols - 1)));
- dstData[j] = (float)(wr * wc);
- }
+ dstData[j] = (float)(wr * wc[j]);
}
}
else
for(int i = 0; i < rows; i++)
{
double* dstData = dst.ptr<double>(i);
- double wr = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)i / (double)(rows - 1)));
+ double wr = 0.5 * (1.0 - cos(coeff1 * i));
for(int j = 0; j < cols; j++)
- {
- double wc = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)j / (double)(cols - 1)));
- dstData[j] = wr * wc;
- }
+ dstData[j] = wr * wc[j];
}
}