Merge pull request #9618 from vipinanand4:goodFeaturesToTrack_added_gradiantSize
authorvipinanand4 <31878630+vipinanand4@users.noreply.github.com>
Fri, 22 Sep 2017 14:04:43 +0000 (19:34 +0530)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 22 Sep 2017 14:04:43 +0000 (14:04 +0000)
Added gradiantSize param into goodFeaturesToTrack API (#9618)

* Added gradiantSize param into goodFeaturesToTrack API

Removed hardcode value 3 in goodFeaturesToTrack API, and
added new param 'gradinatSize' in this API so that user can
pass any gradiant size as 3, 5 or 7.

Signed-off-by: Vipin Anand <anand.vipin@gmail.com>
Signed-off-by: Nilaykumar Patel<nilay.nilpat@gmail.com>
Signed-off-by: Prashanth Voora <prashanthx85@gmail.com>
* fixed compilation error for java test

Signed-off-by: Vipin Anand <anand.vipin@gmail.com>
* Modifying code for previous binary compatibility and fixing other warnings

fixed ABI break issue

resolved merged conflict

compilation error fix

Signed-off-by: Vipin Anand <anand.vipin@gmail.com>
Signed-off-by: Patel, Nilaykumar K <nilay.nilpat@gmail.com>
12 files changed:
modules/features2d/include/opencv2/features2d.hpp
modules/features2d/src/gftt.cpp
modules/features2d/test/test_keypoints.cpp
modules/imgproc/include/opencv2/imgproc.hpp
modules/imgproc/misc/java/test/ImgprocTest.java
modules/imgproc/perf/opencl/perf_gftt.cpp
modules/imgproc/perf/perf_goodFeaturesToTrack.cpp
modules/imgproc/src/featureselect.cpp
modules/imgproc/test/test_goodfeaturetotrack.cpp
samples/cpp/lkdemo.cpp
samples/cpp/tutorial_code/TrackingMotion/cornerSubPix_Demo.cpp
samples/cpp/tutorial_code/TrackingMotion/goodFeaturesToTrack_Demo.cpp

index b0a5f36..3fe5362 100644 (file)
@@ -527,6 +527,8 @@ class CV_EXPORTS_W GFTTDetector : public Feature2D
 public:
     CV_WRAP static Ptr<GFTTDetector> create( int maxCorners=1000, double qualityLevel=0.01, double minDistance=1,
                                              int blockSize=3, bool useHarrisDetector=false, double k=0.04 );
+    CV_WRAP static Ptr<GFTTDetector> create( int maxCorners, double qualityLevel, double minDistance,
+                                             int blockSize, int gradiantSize, bool useHarrisDetector=false, double k=0.04 );
     CV_WRAP virtual void setMaxFeatures(int maxFeatures) = 0;
     CV_WRAP virtual int getMaxFeatures() const = 0;
 
index 1c8db7a..c98e17e 100644 (file)
@@ -48,10 +48,10 @@ class GFTTDetector_Impl : public GFTTDetector
 {
 public:
     GFTTDetector_Impl( int _nfeatures, double _qualityLevel,
-                      double _minDistance, int _blockSize,
+                      double _minDistance, int _blockSize, int _gradientSize,
                       bool _useHarrisDetector, double _k )
         : nfeatures(_nfeatures), qualityLevel(_qualityLevel), minDistance(_minDistance),
-        blockSize(_blockSize), useHarrisDetector(_useHarrisDetector), k(_k)
+        blockSize(_blockSize), gradSize(_gradientSize), useHarrisDetector(_useHarrisDetector), k(_k)
     {
     }
 
@@ -67,6 +67,9 @@ public:
     void setBlockSize(int blockSize_) { blockSize = blockSize_; }
     int getBlockSize() const { return blockSize; }
 
+    void setGradientSize(int gradientSize_) { gradSize = gradientSize_; }
+    int getGradientSize() { return gradSize; }
+
     void setHarrisDetector(bool val) { useHarrisDetector = val; }
     bool getHarrisDetector() const { return useHarrisDetector; }
 
@@ -88,7 +91,7 @@ public:
                 ugrayImage = _image.getUMat();
 
             goodFeaturesToTrack( ugrayImage, corners, nfeatures, qualityLevel, minDistance, _mask,
-                                 blockSize, useHarrisDetector, k );
+                                 blockSize, gradSize, useHarrisDetector, k );
         }
         else
         {
@@ -97,7 +100,7 @@ public:
                 cvtColor( image, grayImage, COLOR_BGR2GRAY );
 
             goodFeaturesToTrack( grayImage, corners, nfeatures, qualityLevel, minDistance, _mask,
-                                blockSize, useHarrisDetector, k );
+                                blockSize, gradSize, useHarrisDetector, k );
         }
 
         keypoints.resize(corners.size());
@@ -112,17 +115,26 @@ public:
     double qualityLevel;
     double minDistance;
     int blockSize;
+    int gradSize;
     bool useHarrisDetector;
     double k;
 };
 
 
 Ptr<GFTTDetector> GFTTDetector::create( int _nfeatures, double _qualityLevel,
+                         double _minDistance, int _blockSize, int _gradientSize,
+                         bool _useHarrisDetector, double _k )
+{
+    return makePtr<GFTTDetector_Impl>(_nfeatures, _qualityLevel,
+                                      _minDistance, _blockSize, _gradientSize, _useHarrisDetector, _k);
+}
+
+Ptr<GFTTDetector> GFTTDetector::create( int _nfeatures, double _qualityLevel,
                          double _minDistance, int _blockSize,
                          bool _useHarrisDetector, double _k )
 {
     return makePtr<GFTTDetector_Impl>(_nfeatures, _qualityLevel,
-                                      _minDistance, _blockSize, _useHarrisDetector, _k);
+                                      _minDistance, _blockSize, 3, _useHarrisDetector, _k);
 }
 
 String GFTTDetector::getDefaultName() const
index fb25514..72bc593 100644 (file)
@@ -139,7 +139,7 @@ TEST(Features2d_Detector_Keypoints_AGAST, validation)
 TEST(Features2d_Detector_Keypoints_HARRIS, validation)
 {
 
-    CV_FeatureDetectorKeypointsTest test(GFTTDetector::create(1000, 0.01, 1, 3, true, 0.04));
+    CV_FeatureDetectorKeypointsTest test(GFTTDetector::create(1000, 0.01, 1, 3, 3, true, 0.04));
     test.safe_run();
 }
 
index bb5c3bd..5a127fb 100644 (file)
@@ -1914,11 +1914,17 @@ or cornerMinEigenVal.
 
 @sa  cornerMinEigenVal, cornerHarris, calcOpticalFlowPyrLK, estimateRigidTransform,
  */
+
 CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners,
                                      int maxCorners, double qualityLevel, double minDistance,
                                      InputArray mask = noArray(), int blockSize = 3,
                                      bool useHarrisDetector = false, double k = 0.04 );
 
+CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners,
+                                     int maxCorners, double qualityLevel, double minDistance,
+                                     InputArray mask, int blockSize,
+                                     int gradientSize, bool useHarrisDetector = false,
+                                     double k = 0.04 );
 /** @example houghlines.cpp
 An example using the Hough line detector
 ![Sample input image](Hough_Lines_Tutorial_Original_Image.jpg) ![Output image](Hough_Lines_Tutorial_Result.jpg)
index 8a5ce2b..204348e 100644 (file)
@@ -1033,7 +1033,7 @@ public class ImgprocTest extends OpenCVTestCase {
         Imgproc.rectangle(src, new Point(2, 2), new Point(8, 8), new Scalar(100), -1);
         MatOfPoint lp = new MatOfPoint();
 
-        Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3, gray1, 4, true, 0);
+        Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3, gray1, 4, 3, true, 0);
 
         assertEquals(4, lp.total());
     }
index b6c3b2c..7445970 100644 (file)
@@ -77,7 +77,7 @@ OCL_PERF_TEST_P(GoodFeaturesToTrackFixture, GoodFeaturesToTrack,
     declare.in(src, WARMUP_READ).out(dst);
 
     OCL_TEST_CYCLE() cv::goodFeaturesToTrack(src, dst, maxCorners, qualityLevel,
-                                             minDistance, noArray(), 3, harrisDetector, 0.04);
+                                             minDistance, noArray(), 3, 3, harrisDetector, 0.04);
 
     SANITY_CHECK(dst);
 }
index 558734c..7ccb65d 100644 (file)
@@ -6,15 +6,16 @@ using namespace perf;
 using std::tr1::make_tuple;
 using std::tr1::get;
 
-typedef std::tr1::tuple<string, int, double, int, bool> Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris_t;
-typedef perf::TestBaseWithParam<Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris_t> Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris;
+typedef std::tr1::tuple<string, int, double, int, int, bool> Image_MaxCorners_QualityLevel_MinDistance_BlockSize_gradientSize_UseHarris_t;
+typedef perf::TestBaseWithParam<Image_MaxCorners_QualityLevel_MinDistance_BlockSize_gradientSize_UseHarris_t> Image_MaxCorners_QualityLevel_MinDistance_BlockSize_gradientSize_UseHarris;
 
-PERF_TEST_P(Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris, goodFeaturesToTrack,
+PERF_TEST_P(Image_MaxCorners_QualityLevel_MinDistance_BlockSize_gradientSize_UseHarris, goodFeaturesToTrack,
             testing::Combine(
                 testing::Values( "stitching/a1.png", "cv/shared/pic5.png"),
                 testing::Values( 100, 500 ),
                 testing::Values( 0.1, 0.01 ),
                 testing::Values( 3, 5 ),
+                testing::Values( 3, 5 ),
                 testing::Bool()
                 )
           )
@@ -23,7 +24,8 @@ PERF_TEST_P(Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris, goodF
     int maxCorners = get<1>(GetParam());
     double qualityLevel = get<2>(GetParam());
     int blockSize = get<3>(GetParam());
-    bool useHarrisDetector = get<4>(GetParam());
+    int gradientSize = get<4>(GetParam());
+    bool useHarrisDetector = get<5>(GetParam());
 
     Mat image = imread(filename, IMREAD_GRAYSCALE);
     if (image.empty())
@@ -32,7 +34,7 @@ PERF_TEST_P(Image_MaxCorners_QualityLevel_MinDistance_BlockSize_UseHarris, goodF
     std::vector<Point2f> corners;
 
     double minDistance = 1;
-    TEST_CYCLE() goodFeaturesToTrack(image, corners, maxCorners, qualityLevel, minDistance, noArray(), blockSize, useHarrisDetector);
+    TEST_CYCLE() goodFeaturesToTrack(image, corners, maxCorners, qualityLevel, minDistance, noArray(), blockSize, gradientSize, useHarrisDetector);
 
     if (corners.size() > 50)
         corners.erase(corners.begin() + 50, corners.end());
index 8bdd517..a171824 100644 (file)
@@ -75,14 +75,14 @@ struct Corner
 
 static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
                                      int maxCorners, double qualityLevel, double minDistance,
-                                     InputArray _mask, int blockSize,
+                                     InputArray _mask, int blockSize, int gradientSize,
                                      bool useHarrisDetector, double harrisK )
 {
     UMat eig, maxEigenValue;
     if( useHarrisDetector )
-        cornerHarris( _image, eig, blockSize, 3, harrisK );
+        cornerHarris( _image, eig, blockSize, gradientSize, harrisK );
     else
-        cornerMinEigenVal( _image, eig, blockSize, 3 );
+        cornerMinEigenVal( _image, eig, blockSize, gradientSize );
 
     Size imgsize = _image.size();
     size_t total, i, j, ncorners = 0, possibleCornersCount =
@@ -275,7 +275,7 @@ struct VxKeypointsComparator
 
 static bool openvx_harris(Mat image, OutputArray _corners,
                           int _maxCorners, double _qualityLevel, double _minDistance,
-                          int _blockSize, double _harrisK)
+                          int _blockSize, int gradiantSize, double _harrisK)
 {
     using namespace ivx;
 
@@ -357,7 +357,7 @@ static bool openvx_harris(Mat image, OutputArray _corners,
 
 void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
                               int maxCorners, double qualityLevel, double minDistance,
-                              InputArray _mask, int blockSize,
+                              InputArray _mask, int blockSize, int gradientSize,
                               bool useHarrisDetector, double harrisK )
 {
     CV_INSTRUMENT_REGION()
@@ -367,7 +367,7 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
 
     CV_OCL_RUN(_image.dims() <= 2 && _image.isUMat(),
                ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,
-                                    _mask, blockSize, useHarrisDetector, harrisK))
+                                    _mask, blockSize, gradientSize, useHarrisDetector, harrisK))
 
     Mat image = _image.getMat(), eig, tmp;
     if (image.empty())
@@ -379,12 +379,12 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
     // Disabled due to bad accuracy
     CV_OVX_RUN(false && useHarrisDetector && _mask.empty() &&
                !ovx::skipSmallImages<VX_KERNEL_HARRIS_CORNERS>(image.cols, image.rows),
-               openvx_harris(image, _corners, maxCorners, qualityLevel, minDistance, blockSize, harrisK))
+               openvx_harris(image, _corners, maxCorners, qualityLevel, minDistance, blockSize, gradiantSize, harrisK))
 
     if( useHarrisDetector )
-        cornerHarris( image, eig, blockSize, 3, harrisK );
+        cornerHarris( image, eig, blockSize, gradientSize, harrisK );
     else
-        cornerMinEigenVal( image, eig, blockSize, 3 );
+        cornerMinEigenVal( image, eig, blockSize, gradientSize );
 
     double maxVal = 0;
     minMaxLoc( eig, 0, &maxVal, 0, 0, _mask );
@@ -535,4 +535,12 @@ cvGoodFeaturesToTrack( const void* _image, void*, void*,
     *_corner_count = (int)ncorners;
 }
 
+void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
+                              int maxCorners, double qualityLevel, double minDistance,
+                              InputArray _mask, int blockSize,
+                              bool useHarrisDetector, double harrisK )
+{
+    cv::goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,
+                              _mask, blockSize, 3, useHarrisDetector,  harrisK );
+}
 /* End of file. */
index 53aa08a..e1b545e 100644 (file)
@@ -161,7 +161,7 @@ test_cornerEigenValsVecs( const Mat& src, Mat& eigenv, int block_size,
 static void
 test_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
                               int maxCorners, double qualityLevel, double minDistance,
-                              InputArray _mask, int blockSize,
+                              InputArray _mask, int blockSize, int gradientSize,
                               bool useHarrisDetector, double harrisK )
 {
 
@@ -170,7 +170,7 @@ test_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
 
 
     Mat image = _image.getMat(), mask = _mask.getMat();
-    int aperture_size = 3;
+    int aperture_size = gradientSize;
     int borderType = BORDER_DEFAULT;
 
     Mat eig, tmp, tt;
@@ -330,6 +330,7 @@ protected:
     double qualityLevel;
     double minDistance;
     int blockSize;
+    int gradientSize;
     bool useHarrisDetector;
     double k;
     int SrcType;
@@ -343,6 +344,7 @@ CV_GoodFeatureToTTest::CV_GoodFeatureToTTest()
     qualityLevel = 0.01;
     minDistance = 10;
     blockSize = 3;
+    gradientSize = 3;
     useHarrisDetector = false;
     k = 0.04;
     mask = Mat();
@@ -397,6 +399,7 @@ void CV_GoodFeatureToTTest::run_func()
                minDistance,
                Mat(),
                blockSize,
+               gradientSize,
                useHarrisDetector,
                k );
     }
@@ -414,6 +417,7 @@ void CV_GoodFeatureToTTest::run_func()
                minDistance,
                Mat(),
                blockSize,
+               gradientSize,
                useHarrisDetector,
                k );
     }
@@ -438,6 +442,7 @@ int CV_GoodFeatureToTTest::validate_test_results( int test_case_idx )
                minDistance,
                Mat(),
                blockSize,
+               gradientSize,
                useHarrisDetector,
                k );
     }
@@ -455,6 +460,7 @@ int CV_GoodFeatureToTTest::validate_test_results( int test_case_idx )
                minDistance,
                Mat(),
                blockSize,
+               gradientSize,
                useHarrisDetector,
                k );
     }
index f8ba732..29f1419 100644 (file)
@@ -81,7 +81,7 @@ int main( int argc, char** argv )
         if( needToInit )
         {
             // automatic initialization
-            goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
+            goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 3, 0, 0.04);
             cornerSubPix(gray, points[1], subPixWinSize, Size(-1,-1), termcrit);
             addRemovePt = false;
         }
index 8e4876b..e58faea 100644 (file)
@@ -59,7 +59,7 @@ void goodFeaturesToTrack_Demo( int, void* )
   vector<Point2f> corners;
   double qualityLevel = 0.01;
   double minDistance = 10;
-  int blockSize = 3;
+  int blockSize = 3, gradiantSize = 3;
   bool useHarrisDetector = false;
   double k = 0.04;
 
@@ -75,6 +75,7 @@ void goodFeaturesToTrack_Demo( int, void* )
                minDistance,
                Mat(),
                blockSize,
+               gradiantSize,
                useHarrisDetector,
                k );
 
index da357e7..1626646 100644 (file)
@@ -59,7 +59,7 @@ void goodFeaturesToTrack_Demo( int, void* )
   vector<Point2f> corners;
   double qualityLevel = 0.01;
   double minDistance = 10;
-  int blockSize = 3;
+  int blockSize = 3, gradiantSize = 3;
   bool useHarrisDetector = false;
   double k = 0.04;
 
@@ -75,6 +75,7 @@ void goodFeaturesToTrack_Demo( int, void* )
                minDistance,
                Mat(),
                blockSize,
+               gradiantSize,
                useHarrisDetector,
                k );