added perf test for cv::goodFeaturesToTrack
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Sat, 18 Jan 2014 17:13:50 +0000 (21:13 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Mon, 20 Jan 2014 09:57:53 +0000 (13:57 +0400)
modules/imgproc/perf/opencl/perf_gftt.cpp [new file with mode: 0644]
modules/imgproc/src/featureselect.cpp
modules/imgproc/src/opencl/gftt.cl
modules/ocl/src/gftt.cpp
modules/ts/include/opencv2/ts/ts_perf.hpp
modules/ts/src/ts_perf.cpp

diff --git a/modules/imgproc/perf/opencl/perf_gftt.cpp b/modules/imgproc/perf/opencl/perf_gftt.cpp
new file mode 100644 (file)
index 0000000..29626c6
--- /dev/null
@@ -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 <sstream>
+
+#ifdef HAVE_OPENCL
+
+namespace cvtest {
+namespace ocl {
+
+//////////////////////////// GoodFeaturesToTrack //////////////////////////
+
+typedef tuple<String, double, bool> GoodFeaturesToTrackParams;
+typedef TestBaseWithParam<GoodFeaturesToTrackParams> 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
index 47015b0..6d4f8c2 100644 (file)
@@ -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<int>(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 )
index 5342426..46e3799 100644 (file)
@@ -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 ));
         }
     }
index 13d0194..2523136 100644 (file)
@@ -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
index fa0e5a2..a0c8934 100644 (file)
@@ -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
index 35204c2..6887922 100644 (file)
@@ -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;