From 5abfd40989674e37f398e8c00b1f2b32891d8531 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Sat, 18 Jan 2014 21:13:50 +0400 Subject: [PATCH] added perf test for cv::goodFeaturesToTrack --- modules/imgproc/perf/opencl/perf_gftt.cpp | 87 +++++++++++++++++++++++++++++++ modules/imgproc/src/featureselect.cpp | 12 ++--- modules/imgproc/src/opencl/gftt.cl | 2 +- modules/ocl/src/gftt.cpp | 1 - modules/ts/include/opencv2/ts/ts_perf.hpp | 1 + modules/ts/src/ts_perf.cpp | 7 ++- 6 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 modules/imgproc/perf/opencl/perf_gftt.cpp diff --git a/modules/imgproc/perf/opencl/perf_gftt.cpp b/modules/imgproc/perf/opencl/perf_gftt.cpp new file mode 100644 index 0000000..29626c6 --- /dev/null +++ b/modules/imgproc/perf/opencl/perf_gftt.cpp @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////////////// +// +// 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, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// +// 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 materials 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 "perf_precomp.hpp" +#include "opencv2/ts/ocl_perf.hpp" + +#include + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +//////////////////////////// GoodFeaturesToTrack ////////////////////////// + +typedef tuple GoodFeaturesToTrackParams; +typedef TestBaseWithParam GoodFeaturesToTrackFixture; + +OCL_PERF_TEST_P(GoodFeaturesToTrackFixture, GoodFeaturesToTrack, + ::testing::Combine(OCL_PERF_ENUM(String("gpu/opticalflow/rubberwhale1.png")), + OCL_PERF_ENUM(0.0, 3.0), Bool())) +{ + GoodFeaturesToTrackParams params = GetParam(); + const String fileName = get<0>(params); + const double minDistance = get<1>(params), qualityLevel = 0.01; + const bool harrisDetector = get<2>(params); + const int maxCorners = 1000; + + Mat img = imread(getDataPath(fileName), cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(img.empty()) << "could not load " << fileName; + + checkDeviceMaxMemoryAllocSize(img.size(), img.type()); + + UMat src(img.size(), img.type()), dst(1, maxCorners, CV_32FC2); + img.copyTo(src); + + declare.in(src, WARMUP_READ).out(dst); + + OCL_TEST_CYCLE() cv::goodFeaturesToTrack(src, dst, maxCorners, qualityLevel, + minDistance, noArray(), 3, harrisDetector, 0.04); + + SANITY_CHECK(dst); +} + +} } // namespace cvtest::ocl + +#endif diff --git a/modules/imgproc/src/featureselect.cpp b/modules/imgproc/src/featureselect.cpp index 47015b0..6d4f8c2 100644 --- a/modules/imgproc/src/featureselect.cpp +++ b/modules/imgproc/src/featureselect.cpp @@ -96,7 +96,7 @@ static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners, return false; UMat counter(1, 1, CV_32SC1, Scalar::all(0)), - corners(1, possibleCornersCount * sizeof(Corner), CV_8UC1); + corners(1, (int)(possibleCornersCount * sizeof(Corner)), CV_8UC1); ocl::KernelArg eigarg = ocl::KernelArg::ReadOnlyNoSize(eig), tmparg = ocl::KernelArg::ReadOnlyNoSize(tmp), cornersarg = ocl::KernelArg::PtrWriteOnly(corners), @@ -117,7 +117,7 @@ static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners, return false; total = counter.getMat(ACCESS_READ).at(0, 0); - size_t totalb = sizeof(Corner) * total; + int totalb = (int)(sizeof(Corner) * total); tmpCorners.resize(total); Mat mcorners(1, totalb, CV_8UC1, &tmpCorners[0]); @@ -221,12 +221,10 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, CV_Assert( qualityLevel > 0 && minDistance >= 0 && maxCorners >= 0 ); CV_Assert( _mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image)) ); - if (ocl::useOpenCL() && _image.dims() <= 2 && _image.isUMat()) - { - CV_Assert(ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance, - _mask, blockSize, useHarrisDetector, harrisK)); + if (ocl::useOpenCL() && _image.dims() <= 2 && _image.isUMat() && + ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance, + _mask, blockSize, useHarrisDetector, harrisK)) return; - } Mat image = _image.getMat(), eig, tmp; if( useHarrisDetector ) diff --git a/modules/imgproc/src/opencl/gftt.cl b/modules/imgproc/src/opencl/gftt.cl index 5342426..46e3799 100644 --- a/modules/imgproc/src/opencl/gftt.cl +++ b/modules/imgproc/src/opencl/gftt.cl @@ -74,7 +74,7 @@ __kernel void findCorners(__global const uchar * eigptr, int eig_step, int eig_o #endif ) { - __global float2 * corners = (cornersptr + (int)sizeof(float2) * atomic_inc(counter)); + __global float2 * corners = (__global float2 *)(cornersptr + (int)sizeof(float2) * atomic_inc(counter)); corners[0] = (float2)(val, as_float( (x<<16) | y )); } } diff --git a/modules/ocl/src/gftt.cpp b/modules/ocl/src/gftt.cpp index 13d0194..2523136 100644 --- a/modules/ocl/src/gftt.cpp +++ b/modules/ocl/src/gftt.cpp @@ -196,7 +196,6 @@ void cv::ocl::GoodFeaturesToTrackDetector_OCL::operator ()(const oclMat& image, // sort detected corners on cpu side. tmp.resize(total); - printf("total: %d\n", total); std::sort(tmp.begin(), tmp.end(), DefCornerCompare()); // estimate maximal size of final output array diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index fa0e5a2..a0c8934 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -389,6 +389,7 @@ CV_EXPORTS void PrintTo(const MatType& t, std::ostream* os); namespace cv { +CV_EXPORTS void PrintTo(const String& str, ::std::ostream* os); CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); } //namespace cv diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index 35204c2..6887922 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -1199,7 +1199,7 @@ void TestBase::validateMetrics() double mean = metrics.mean * 1000.0f / metrics.frequency; double stddev = metrics.stddev * 1000.0f / metrics.frequency; double percents = stddev / mean * 100.f; - printf(" samples = %d, mean = %.2f, stddev = %.2f (%.1f%%)\n", (int)metrics.samples, mean, stddev, percents); + printf("[ PERFSTAT ] (samples = %d, mean = %.2f, stddev = %.2f (%.1f%%))\n", (int)metrics.samples, mean, stddev, percents); } else { @@ -1611,6 +1611,11 @@ void PrintTo(const MatType& t, ::std::ostream* os) \*****************************************************************************************/ namespace cv { +void PrintTo(const String& str, ::std::ostream* os) +{ + *os << str; +} + void PrintTo(const Size& sz, ::std::ostream* os) { *os << /*"Size:" << */sz.width << "x" << sz.height; -- 2.7.4