mirror of
https://gitcode.com/gh_mirrors/es/esp32-opencv.git
synced 2025-08-15 03:01:04 +08:00
initial commit
This commit is contained in:
162
modules/core/perf/perf_math.cpp
Normal file
162
modules/core/perf/perf_math.cpp
Normal file
@ -0,0 +1,162 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
namespace opencv_test
|
||||
{
|
||||
using namespace perf;
|
||||
|
||||
namespace {
|
||||
|
||||
typedef perf::TestBaseWithParam<size_t> VectorLength;
|
||||
|
||||
PERF_TEST_P(VectorLength, phase32f, testing::Values(128, 1000, 128*1024, 512*1024, 1024*1024))
|
||||
{
|
||||
size_t length = GetParam();
|
||||
vector<float> X(length);
|
||||
vector<float> Y(length);
|
||||
vector<float> angle(length);
|
||||
|
||||
declare.in(X, Y, WARMUP_RNG).out(angle);
|
||||
|
||||
TEST_CYCLE_N(200) cv::phase(X, Y, angle, true);
|
||||
|
||||
SANITY_CHECK(angle, 5e-5);
|
||||
}
|
||||
|
||||
PERF_TEST_P(VectorLength, phase64f, testing::Values(128, 1000, 128*1024, 512*1024, 1024*1024))
|
||||
{
|
||||
size_t length = GetParam();
|
||||
vector<double> X(length);
|
||||
vector<double> Y(length);
|
||||
vector<double> angle(length);
|
||||
|
||||
declare.in(X, Y, WARMUP_RNG).out(angle);
|
||||
|
||||
TEST_CYCLE_N(200) cv::phase(X, Y, angle, true);
|
||||
|
||||
SANITY_CHECK(angle, 5e-5);
|
||||
}
|
||||
|
||||
typedef perf::TestBaseWithParam< testing::tuple<int, int, int> > KMeans;
|
||||
|
||||
PERF_TEST_P_(KMeans, single_iter)
|
||||
{
|
||||
RNG& rng = theRNG();
|
||||
const int K = testing::get<0>(GetParam());
|
||||
const int dims = testing::get<1>(GetParam());
|
||||
const int N = testing::get<2>(GetParam());
|
||||
const int attempts = 5;
|
||||
|
||||
Mat data(N, dims, CV_32F);
|
||||
rng.fill(data, RNG::UNIFORM, -0.1, 0.1);
|
||||
|
||||
const int N0 = K;
|
||||
Mat data0(N0, dims, CV_32F);
|
||||
rng.fill(data0, RNG::UNIFORM, -1, 1);
|
||||
|
||||
for (int i = 0; i < N; i++)
|
||||
{
|
||||
int base = rng.uniform(0, N0);
|
||||
cv::add(data0.row(base), data.row(i), data.row(i));
|
||||
}
|
||||
|
||||
declare.in(data);
|
||||
|
||||
Mat labels, centers;
|
||||
|
||||
TEST_CYCLE()
|
||||
{
|
||||
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 1, 0),
|
||||
attempts, KMEANS_PP_CENTERS, centers);
|
||||
}
|
||||
|
||||
SANITY_CHECK_NOTHING();
|
||||
}
|
||||
|
||||
PERF_TEST_P_(KMeans, good)
|
||||
{
|
||||
RNG& rng = theRNG();
|
||||
const int K = testing::get<0>(GetParam());
|
||||
const int dims = testing::get<1>(GetParam());
|
||||
const int N = testing::get<2>(GetParam());
|
||||
const int attempts = 5;
|
||||
|
||||
Mat data(N, dims, CV_32F);
|
||||
rng.fill(data, RNG::UNIFORM, -0.1, 0.1);
|
||||
|
||||
const int N0 = K;
|
||||
Mat data0(N0, dims, CV_32F);
|
||||
rng.fill(data0, RNG::UNIFORM, -1, 1);
|
||||
|
||||
for (int i = 0; i < N; i++)
|
||||
{
|
||||
int base = rng.uniform(0, N0);
|
||||
cv::add(data0.row(base), data.row(i), data.row(i));
|
||||
}
|
||||
|
||||
declare.in(data);
|
||||
|
||||
Mat labels, centers;
|
||||
|
||||
TEST_CYCLE()
|
||||
{
|
||||
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
|
||||
attempts, KMEANS_PP_CENTERS, centers);
|
||||
}
|
||||
|
||||
SANITY_CHECK_NOTHING();
|
||||
}
|
||||
|
||||
PERF_TEST_P_(KMeans, with_duplicates)
|
||||
{
|
||||
RNG& rng = theRNG();
|
||||
const int K = testing::get<0>(GetParam());
|
||||
const int dims = testing::get<1>(GetParam());
|
||||
const int N = testing::get<2>(GetParam());
|
||||
const int attempts = 5;
|
||||
|
||||
Mat data(N, dims, CV_32F, Scalar::all(0));
|
||||
|
||||
const int N0 = std::max(2, K * 2 / 3);
|
||||
Mat data0(N0, dims, CV_32F);
|
||||
rng.fill(data0, RNG::UNIFORM, -1, 1);
|
||||
|
||||
for (int i = 0; i < N; i++)
|
||||
{
|
||||
int base = rng.uniform(0, N0);
|
||||
data0.row(base).copyTo(data.row(i));
|
||||
}
|
||||
|
||||
declare.in(data);
|
||||
|
||||
Mat labels, centers;
|
||||
|
||||
TEST_CYCLE()
|
||||
{
|
||||
kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
|
||||
attempts, KMEANS_PP_CENTERS, centers);
|
||||
}
|
||||
|
||||
SANITY_CHECK_NOTHING();
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(/*nothing*/ , KMeans,
|
||||
testing::Values(
|
||||
// K clusters, dims, N points
|
||||
testing::make_tuple(2, 3, 100000),
|
||||
testing::make_tuple(4, 3, 500),
|
||||
testing::make_tuple(4, 3, 1000),
|
||||
testing::make_tuple(4, 3, 10000),
|
||||
testing::make_tuple(8, 3, 1000),
|
||||
testing::make_tuple(8, 16, 1000),
|
||||
testing::make_tuple(8, 64, 1000),
|
||||
testing::make_tuple(16, 16, 1000),
|
||||
testing::make_tuple(16, 32, 1000),
|
||||
testing::make_tuple(32, 16, 1000),
|
||||
testing::make_tuple(32, 32, 1000),
|
||||
testing::make_tuple(100, 2, 1000)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
} // namespace
|
Reference in New Issue
Block a user