opencv/modules/ocl/perf/perf_test_ocl.cpp

1192 lines
30 KiB
C++

/*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.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2012, Multicore Ware, Inc., all rights reserved.
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// @Authors
// Peng Xiao, pengxiao@multicorewareinc.com
//
// 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 oclMaterials provided with the distribution.
//
// * The name of the copyright holders 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*/
#include "precomp.hpp"
#include <ctime>
#if PERF_TEST_OCL
#ifdef HAVE_OPENCL
#define SHOW_CPU false
#define REPEAT 1000
#define COUNT_U 0 // count the uploading execution time for ocl mat structures
#define COUNT_D 0
// the following macro section tests the target function (kernel) performance
// upload is the code snippet for converting cv::mat to cv::ocl::oclMat
// downloading is the code snippet for converting cv::ocl::oclMat back to cv::mat
// change COUNT_U and COUNT_D to take downloading and uploading time into account
#define P_TEST_FULL( upload, kernel_call, download ) \
{ \
std::cout<< "\n" #kernel_call "\n----------------------"; \
{upload;} \
R_TEST( kernel_call, 15 ); \
double t = (double)cvGetTickCount(); \
R_T( { \
if( COUNT_U ) {upload;} \
kernel_call; \
if( COUNT_D ) {download;} \
} ); \
t = (double)cvGetTickCount() - t; \
std::cout << "runtime is " << t/((double)cvGetTickFrequency()* 1000.) << "ms" << std::endl; \
}
#define R_T2( test ) \
{ \
std::cout<< "\n" #test "\n----------------------"; \
R_TEST( test, 15 ) \
clock_t st = clock(); \
R_T( test ) \
std::cout<< clock() - st << "ms\n"; \
}
#define R_T( test ) \
R_TEST( test, REPEAT )
#define R_TEST( test, repeat ) \
try{ \
for( int i = 0; i < repeat; i ++ ) { test; } \
} catch( ... ) { std::cout << "||||| Exception catched! |||||\n"; return; }
#define FILTER_TEST_IMAGE "C:/Windows/Web/Wallpaper/Landscapes/img9.jpg"
#define WARN_NRUN( name ) \
std::cout << "Warning: " #name " is not runnable!\n";
void print_info();
// performance base class
struct PerfTest
{
virtual void Run() = 0;
protected:
virtual void SetUp() = 0;
};
///////////////////////////////////////
// Arithm
struct ArithmTestP : PerfTest
{
int type;
cv::Scalar val;
cv::Size size;
cv::Mat mat1, mat2;
cv::Mat mask;
cv::Mat dst;
cv::ocl::oclMat oclRes, oclmat1, oclmat2;
cv::ocl::oclMat oclmask;
std::vector<cv::Mat> dstv;
protected:
ArithmTestP() : type( CV_8UC4 ) {}
virtual void SetUp()
{
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size( 3000, 3000 ); // big input image
mat1 = cvtest::randomMat(rng, size, type, 1, 255, false);
mat2 = cvtest::randomMat(rng, size, type, 1, 255, false);
mask = cvtest::randomMat(rng, size, CV_8UC1, 0, 2, false);
cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0));
oclmat1 = cv::ocl::oclMat(mat1);
oclmat2 = cv::ocl::oclMat(mat2);
oclmask = cv::ocl::oclMat(mask);
}
};
struct AddArrayP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::add(oclmat1, oclmat2, oclRes),
oclRes.download(dst);
);
}
};
struct SubtractArrayP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::subtract(oclmat1, oclmat2, oclRes),
oclRes.download(dst);
);
}
};
struct MultiplyArrayP : ArithmTestP
{
virtual void Run()
{
SetUp();
clock_t start = clock();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::multiply(oclmat1, oclmat2, oclRes),
oclRes.download(dst);
);
}
};
struct DivideArrayP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::divide(oclmat1, oclmat2, oclRes),
oclRes.download(dst);
);
}
};
struct ExpP : ArithmTestP
{
void Run()
{
type = CV_32FC1;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::exp(oclmat1, oclRes),
oclRes.download(dst);
);
}
};
struct LogP : ArithmTestP
{
void Run()
{
type = CV_32FC1;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::log(oclmat1, oclRes),
oclRes.download(dst);
);
}
};
struct CompareP : ArithmTestP
{
virtual void Run()
{
type = CV_32FC1;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::compare(oclmat1, oclmat2, oclRes, cv::CMP_EQ),
oclRes.download(dst);
);
}
};
struct FlipP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::flip(oclmat1, oclRes, 0),
oclRes.download(dst);
);
}
protected:
virtual void SetUp()
{
type = CV_8UC4;
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size(3000, 3000);
mat1 = cvtest::randomMat(rng, size, type, 1, 255, false);
oclmat1 = cv::ocl::oclMat(mat1);
}
};
struct MagnitudeP : ArithmTestP
{
virtual void Run()
{
type = CV_32F;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::magnitude(oclmat1, oclmat1, oclRes),
oclRes.download(dst);
);
}
};
struct LUTP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);ocllut = cv::ocl::oclMat(lut),
cv::ocl::LUT(oclmat1, ocllut, oclRes),
oclRes.download(dst);
);
}
protected:
cv::Mat lut;
cv::ocl::oclMat ocllut;
virtual void SetUp()
{
type = CV_8UC1;
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size(3000, 3000);
mat1 = cvtest::randomMat(rng, size, type, 1, 255, false);
lut = cvtest::randomMat(rng, cv::Size(256, 1), CV_8UC1, 100, 200, false);
oclmat1 = cv::ocl::oclMat(mat1);
ocllut = cv::ocl::oclMat(lut);
}
};
struct MinMaxP : ArithmTestP
{
double minVal_gold, minVal;
double maxVal_gold, maxVal;
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::minMax(oclmat1, &minVal, &maxVal, oclmat2),
{};
);
}
protected:
virtual void SetUp()
{
type = CV_64F;
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size(3000, 3000);
mat1 = cvtest::randomMat(rng, size, type, 0.0, 127.0, false);
mat2 = cvtest::randomMat(rng, size, CV_8UC1, 0, 2, false);
oclmat1 = cv::ocl::oclMat(mat1);
oclmat2 = cv::ocl::oclMat(mat2);
}
};
struct MinMaxLocP : MinMaxP
{
cv::Point minLoc_gold;
cv::Point maxLoc_gold;
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::minMaxLoc(oclmat1, &minVal, &maxVal, &minLoc_gold, &maxLoc_gold, oclmat2),
{}
);
}
};
struct CountNonZeroP : ArithmTestP
{
int n;
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
n = cv::ocl::countNonZero(oclmat1),
{}
);
}
protected:
virtual void SetUp()
{
type = 6;
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size( 3000, 3000 );
cv::Mat matBase = cvtest::randomMat(rng, size, CV_8U, 0.0, 1.0, false);
matBase.convertTo(mat1, type);
oclmat1 = cv::ocl::oclMat(mat1);
}
};
struct SumP : ArithmTestP
{
virtual void Run()
{
SetUp();
cv::Scalar n;
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
n = cv::ocl::sum(oclmat1),
{}
);
}
};
struct BitwiseP : ArithmTestP
{
protected:
virtual void SetUp()
{
type = CV_8UC4;
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size( 3000, 3000 );
mat1.create(size, type);
mat2.create(size, type);
for (int i = 0; i < mat1.rows; ++i)
{
cv::Mat row1(1, static_cast<int>(mat1.cols * mat1.elemSize()), CV_8U, (void*)mat1.ptr(i));
rng.fill(row1, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(255));
cv::Mat row2(1, static_cast<int>(mat2.cols * mat2.elemSize()), CV_8U, (void*)mat2.ptr(i));
rng.fill(row2, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(255));
}
oclmat1 = cv::ocl::oclMat(mat1);
oclmat2 = cv::ocl::oclMat(mat2);
}
};
struct BitwiseNotP : BitwiseP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::bitwise_not(oclmat1, oclRes),
oclRes.download(dst)
);
}
};
struct BitwiseAndP : BitwiseP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::bitwise_and(oclmat1, oclmat2, oclRes),
oclRes.download(dst)
);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::bitwise_and(oclmat1, val, oclRes),
oclRes.download(dst)
);
}
};
struct BitwiseXorP : BitwiseP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::bitwise_xor(oclmat1, oclmat2, oclRes),
oclRes.download(dst)
);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::bitwise_xor(oclmat1, val, oclRes),
oclRes.download(dst)
);
}
};
struct BitwiseOrP : BitwiseP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::bitwise_or(oclmat1, oclmat2, oclRes),
oclRes.download(dst)
);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::bitwise_or(oclmat1, val, oclRes),
oclRes.download(dst)
);
}
};
struct TransposeP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::transpose(oclmat1, oclRes),
oclRes.download(dst)
);
}
};
struct AbsdiffArrayP : ArithmTestP
{
virtual void Run()
{
type = CV_32FC1;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::absdiff(oclmat1, oclmat2, oclRes),
oclRes.download(dst)
);
}
};
struct PhaseP : ArithmTestP
{
virtual void Run()
{
type = CV_32F;
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2),
cv::ocl::phase(oclmat1,oclmat2,oclRes,1),
oclRes.download(dst)
);
}
};
struct CartToPolarP : ArithmTestP
{
cv::ocl::oclMat oclRes1;
virtual void Run()
{
type = CV_64FC4;
SetUp();
clock_t start = clock();
R_TEST(
cv::ocl::cartToPolar(oclmat1,oclmat2,oclRes, oclRes1, 1);
if( COUNT_D ) {oclRes.download(dst);oclRes1.download(dst);}
, 5);
std::cout<< "ocl::CartToPolar -- " << clock() - start << "ms\n";
}
};
struct PolarToCartP : ArithmTestP
{
cv::ocl::oclMat oclRes1;
virtual void Run()
{
type = CV_64FC4;
SetUp();
clock_t start = clock();
R_TEST(
cv::ocl::polarToCart(oclmat1,oclmat2,oclRes, oclRes1, 1);
if( COUNT_D ) {oclRes.download(dst);oclRes1.download(dst);}
, 2);
std::cout<< "ocl::polarToCart -- " << clock() - start << "ms\n";
}
};
///////////////////////////////////////
// split & merge
struct SplitP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::split(oclmat1, dev_dst),
{
dstv.resize(dev_dst.size());
for (size_t i = 0; i < dev_dst.size(); ++i)
{
dev_dst[i].download(dstv[i]);
}
}
);
}
protected:
std::vector<cv::ocl::oclMat> dev_dst;
virtual void SetUp()
{
size = cv::Size( 3000, 3000 );
mat1.create(size, type);
mat1.setTo(cv::Scalar(1.0, 2.0, 3.0, 4.0));
oclmat1 = cv::ocl::oclMat(mat1);
}
};
struct MergeP : SplitP
{
virtual void Run()
{
SetUp();
cv::ocl::split(oclmat1, dev_dst);
cv::split(mat1, dstv);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
cv::ocl::merge(dev_dst, oclmat2),
oclmat2.download(dst)
);
}
};
struct SetToP : ArithmTestP
{
virtual void Run()
{
SetUp();
static cv::Scalar s = cv::Scalar(1, 2, 3, 4);
P_TEST_FULL(
oclmat2 = cv::ocl::oclMat(mat2),
oclmat1.setTo( s, oclmat2 ),
oclmat1.download(dst);
);
}
protected:
virtual void SetUp()
{
type = CV_32FC4;
size = cv::Size(3000, 3000);
mat1.create(size, type);
oclmat1.create(size, type);
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
mat2 = cvtest::randomMat(rng, size, CV_8UC1, 0.0, 1.5, false);
oclmat2 = cv::ocl::oclMat(mat2);
}
};
struct CopyToP : SetToP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
oclmat1.copyTo( oclRes, oclmat2 ),
oclRes.download(dst)
);
}
};
struct ConvertToP : ArithmTestP
{
virtual void Run()
{
type = CV_32FC1;;
SetUp();
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
const double a = rng.uniform(0.0, 1.0);
const double b = rng.uniform(-10.0, 10.0);
int type2 = CV_32FC4;
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat(mat1),
oclmat1.convertTo( oclRes, type2 /*, a, b */ ), // fails when scaling factors a and b are specified
oclRes.download(dst)
);
}
};
////////////////////////////////////////////
// Filters
struct FilterTestP : PerfTest
{
protected:
int ksize;
int dx, dy;
cv::Mat img_rgba;
cv::Mat img_gray;
cv::ocl::oclMat ocl_img_rgba;
cv::ocl::oclMat ocl_img_gray;
cv::ocl::oclMat dev_dst_rgba;
cv::ocl::oclMat dev_dst_gray;
cv::Mat dst_rgba;
cv::Mat dst_gray;
cv::Mat kernel;
int bordertype;
virtual void SetUp()
{
bordertype = (int)cv::BORDER_DEFAULT;
ksize = 7;
dx = ksize/2; dy = ksize/2;
kernel = cv::Mat::ones(ksize, ksize, CV_8U);
cv::Mat img = readImage(FILTER_TEST_IMAGE);
ASSERT_FALSE(img.empty());
cv::cvtColor(img, img_rgba, CV_BGR2BGRA);
cv::cvtColor(img, img_gray, CV_BGR2GRAY);
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
}
};
struct BlurP : FilterTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::blur(ocl_img_rgba, dev_dst_rgba, cv::Size(ksize, ksize), cv::Point(-1,-1), bordertype);
cv::ocl::blur(ocl_img_gray, dev_dst_gray, cv::Size(ksize, ksize), cv::Point(-1,-1), bordertype);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct SobelP : FilterTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::Sobel(ocl_img_rgba, dev_dst_rgba, -1, dx, dy, ksize, 1, 0, bordertype);
cv::ocl::Sobel(ocl_img_gray, dev_dst_gray, -1, dx, dy, ksize, 1, 0, bordertype);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct ScharrP : FilterTestP
{
virtual void Run()
{
SetUp();
dx = 0; dy = 1;
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::Scharr(ocl_img_rgba, dev_dst_rgba, -1, dx, dy, 1, 0, bordertype);
cv::ocl::Scharr(ocl_img_gray, dev_dst_gray, -1, dx, dy, 1, 0, bordertype);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct GaussianBlurP : FilterTestP
{
virtual void Run()
{
double sigma1 = 3, sigma2 = 3;
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::GaussianBlur(ocl_img_rgba, dev_dst_rgba, cv::Size(ksize, ksize), sigma1, sigma2);
cv::ocl::GaussianBlur(ocl_img_gray, dev_dst_gray, cv::Size(ksize, ksize), sigma1, sigma2);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct DilateP : FilterTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::dilate(ocl_img_rgba, dev_dst_rgba, kernel);
cv::ocl::dilate(ocl_img_gray, dev_dst_gray, kernel);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct ErodeP : FilterTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::erode(ocl_img_rgba, dev_dst_rgba, kernel);
cv::ocl::erode(ocl_img_gray, dev_dst_gray, kernel);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct MorphExP : FilterTestP
{
virtual void Run()
{
SetUp();
cv::ocl::oclMat okernel;
P_TEST_FULL(
{
okernel = cv::ocl::oclMat(kernel);
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::morphologyEx(ocl_img_rgba, dev_dst_rgba, 3, okernel);
cv::ocl::morphologyEx(ocl_img_gray, dev_dst_gray, 3, okernel);
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
struct LaplacianP : FilterTestP
{
void Run()
{
SetUp();
P_TEST_FULL(
{
ocl_img_rgba = cv::ocl::oclMat(img_rgba);
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::Laplacian(ocl_img_rgba, dev_dst_rgba, -1, 3 );
cv::ocl::Laplacian(ocl_img_gray, dev_dst_gray, -1, 3 );
},
{
dev_dst_rgba.download(dst_rgba);
dev_dst_gray.download(dst_gray);
});
}
};
////////////////////
// histograms
struct CalcHistP : PerfTest
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat = cv::ocl::oclMat( src ),
cv::ocl::calcHist(oclmat, oclRes),
oclRes.download(hist)
);
}
protected:
cv::Size size;
cv::Mat src, hist;
cv::ocl::oclMat oclmat;
cv::ocl::oclMat oclRes;
virtual void SetUp()
{
cv::RNG& rng = cvtest::TS::ptr()->get_rng();
size = cv::Size(3000, 3000);
src = cvtest::randomMat(rng, size, CV_8UC1, 0, 255, false);
oclmat = cv::ocl::oclMat( src );
}
};
struct EqualizeHistP : CalcHistP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat = cv::ocl::oclMat( src ),
cv::ocl::equalizeHist(oclmat, oclRes),
oclRes.download(hist)
);
}
};
struct ThresholdP : CalcHistP
{
virtual void Run()
{
SetUp();
int threshOp = (int)cv::THRESH_TOZERO_INV;;
double maxVal = 200;
double thresh = 125;
clock_t start = clock();
P_TEST_FULL(
oclmat = cv::ocl::oclMat( src ),
cv::ocl::threshold(oclmat, oclRes, thresh, maxVal, threshOp ),
oclRes.download(hist)
);
}
};
struct ResizeP : ArithmTestP
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat( mat1 ),
cv::ocl::resize(oclmat1, oclRes, cv::Size(), 2.0, 2.0),
oclRes.download(dst)
);
}
};
struct CvtColorP : PerfTest
{
virtual void Run()
{
SetUp();
P_TEST_FULL(
oclmat = cv::ocl::oclMat( img ),
cv::ocl::cvtColor(oclmat, ocldst, cvtcode),
ocldst.download(dst)
);
}
protected:
int type;
int cvtcode;
cv::Mat img, dst;
cv::ocl::oclMat oclmat, ocldst;
virtual void SetUp()
{
type = CV_8U;
cvtcode = CV_BGR2GRAY;
cv::Mat imgBase = readImage(FILTER_TEST_IMAGE);
ASSERT_FALSE(imgBase.empty());
imgBase.convertTo(img, type, type == CV_32F ? 1.0 / 255.0 : 1.0);
oclmat = cv::ocl::oclMat( img );
};
};
struct WarpAffineP : ArithmTestP
{
void Run()
{
SetUp();
const double aplha = CV_PI / 4;
double mat[2][3] = { {std::cos(aplha), -std::sin(aplha), mat1.cols / 2},
{std::sin(aplha), std::cos(aplha), 0}};
cv::Mat M(2, 3, CV_64F, (void*) mat);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat( mat1 ),
cv::ocl::warpAffine( oclmat1, oclRes, M, cv::Size(1500, 1500) ),
oclRes.download(dst)
);
}
};
struct WarpPerspectiveP : ArithmTestP
{
void Run()
{
SetUp();
const double aplha = CV_PI / 4;
double mat[3][3] = { {std::cos(aplha), -std::sin(aplha), mat1.cols / 2},
{std::sin(aplha), std::cos(aplha), 0},
{0.0, 0.0, 1.0}};
cv::Mat M(3, 3, CV_64F, (void*) mat);
P_TEST_FULL(
oclmat1 = cv::ocl::oclMat( mat1 ),
cv::ocl::warpPerspective( oclmat1, oclRes, M, cv::Size(1500, 1500) ),
oclRes.download(dst)
);
}
};
struct CornerHarrisP : FilterTestP
{
void Run()
{
SetUp();
bordertype = 2;
P_TEST_FULL(
{
ocl_img_gray = cv::ocl::oclMat(img_gray);
},
{
cv::ocl::cornerHarris(ocl_img_gray, dev_dst_gray, 3, ksize, 0.5, bordertype );
},
{
dev_dst_gray.download(dst_gray);
});
}
};
void test()
{
clock_t start = clock();
std::cout << ">>>>>>>> Performance test started <<<<<<<<\n";
/*
{
AddArrayP AddArrayP;
AddArrayP.Run();
SubtractArrayP subarray;
subarray.Run();
MultiplyArrayP MultiplyArrayP;
MultiplyArrayP.Run();
DivideArrayP DivideArrayP;
DivideArrayP.Run();
}
std::cout.flush();
{
CompareP comp;
comp.Run();
MagnitudeP magnitude;
magnitude.Run();
LUTP lut;
lut.Run();
FlipP FlipP;
FlipP.Run();
MinMaxP minmax;
minmax.Run();
MinMaxLocP minmaxloc;
minmaxloc.Run();
CountNonZeroP cnz;
cnz.Run();
SumP sum;
sum.Run();
}*/
/* std::cout.flush();
{
BitwiseNotP bn;
bn.Run();
BitwiseOrP bo;
bo.Run();
BitwiseAndP ba;
ba.Run();
BitwiseXorP bx;
bx.Run();
}*/
std::cout.flush();
{
// TransposeP transpose;
// transpose.Run();
// AbsdiffArrayP absdiff;
// absdiff.Run();
// SplitP split;
// split.Run();
// MergeP merge;
// merge.Run();
/*
SetToP setto;
setto.Run();
CopyToP copyto;
copyto.Run();
ConvertToP convertto;
convertto.Run();
*/
}
/*
std::cout.flush();
{
BlurP blur;
blur.Run();
SobelP sobel;
sobel.Run();
ScharrP scharr;
scharr.Run();
GaussianBlurP gblur;
gblur.Run();
DilateP dilate;
dilate.Run();
ErodeP erode;
erode.Run();
}
std::cout.flush();
{
MorphExP morphex;
morphex.Run();
CalcHistP calchist;
calchist.Run();
EqualizeHistP eqhist;
eqhist.Run();
ThresholdP threshold;
threshold.Run();
ResizeP resize;
resize.Run();
CvtColorP cvtcolor;
cvtcolor.Run();
}
{
LogP log;
log.Run();
ExpP exp;
exp.Run();
}
std::cout.flush();
{
//PhaseP phase;
//phase.Run();
}
std::cout.flush();
{
CartToPolarP ctop;
ctop.Run();
}
std::cout.flush();
{
PolarToCartP ptoc;
ptoc.Run();
}
{
WarpAffineP warpA;
warpA.Run();
WarpPerspectiveP warpP;
warpP.Run();
}
{
CornerHarrisP ch;
ch.Run();
}
{
LaplacianP laplacian;
laplacian.Run();
}
*/
std::cout << ">>>>>>>> Performance test ended <<<<<<<<\ntotal - " << clock() - start << "ms\n";
std::cout.flush();
}
void run_perf_test()
{
print_info();
cvtest::TS::ptr()->init("ocl");
test();
}
#endif // WITH_OPENCL
#endif // PREF_TEST_OCL