1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                        Intel License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000, Intel Corporation, all rights reserved.
14// Third party copyrights are property of their respective owners.
15//
16// Redistribution and use in source and binary forms, with or without modification,
17// are permitted provided that the following conditions are met:
18//
19//   * Redistribution's of source code must retain the above copyright notice,
20//     this list of conditions and the following disclaimer.
21//
22//   * Redistribution's in binary form must reproduce the above copyright notice,
23//     this list of conditions and the following disclaimer in the documentation
24//     and/or other materials provided with the distribution.
25//
26//   * The name of Intel Corporation may not be used to endorse or promote products
27//     derived from this software without specific prior written permission.
28//
29// This software is provided by the copyright holders and contributors "as is" and
30// any express or implied warranties, including, but not limited to, the implied
31// warranties of merchantability and fitness for a particular purpose are disclaimed.
32// In no event shall the Intel Corporation or contributors be liable for any direct,
33// indirect, incidental, special, exemplary, or consequential damages
34// (including, but not limited to, procurement of substitute goods or services;
35// loss of use, data, or profits; or business interruption) however caused
36// and on any theory of liability, whether in contract, strict liability,
37// or tort (including negligence or otherwise) arising in any way out of
38// the use of this software, even if advised of the possibility of such damage.
39//
40//M*/
41
42#include "test_precomp.hpp"
43#include "opencv2/highgui.hpp"
44#include "opencv2/core/core_c.h"
45
46using namespace std;
47using namespace cv;
48
49const string FEATURES2D_DIR = "features2d";
50const string IMAGE_FILENAME = "tsukuba.png";
51
52/****************************************************************************************\
53*                                     Test for KeyPoint                                  *
54\****************************************************************************************/
55
56class CV_FeatureDetectorKeypointsTest : public cvtest::BaseTest
57{
58public:
59    CV_FeatureDetectorKeypointsTest(const Ptr<FeatureDetector>& _detector) :
60        detector(_detector) {}
61
62protected:
63    virtual void run(int)
64    {
65        CV_Assert(detector);
66        string imgFilename = string(ts->get_data_path()) + FEATURES2D_DIR + "/" + IMAGE_FILENAME;
67
68        // Read the test image.
69        Mat image = imread(imgFilename);
70        if(image.empty())
71        {
72            ts->printf(cvtest::TS::LOG, "Image %s can not be read.\n", imgFilename.c_str());
73            ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
74            return;
75        }
76
77        vector<KeyPoint> keypoints;
78        detector->detect(image, keypoints);
79
80        if(keypoints.empty())
81        {
82            ts->printf(cvtest::TS::LOG, "Detector can't find keypoints in image.\n");
83            ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
84            return;
85        }
86
87        Rect r(0, 0, image.cols, image.rows);
88        for(size_t i = 0; i < keypoints.size(); i++)
89        {
90            const KeyPoint& kp = keypoints[i];
91
92            if(!r.contains(kp.pt))
93            {
94                ts->printf(cvtest::TS::LOG, "KeyPoint::pt is out of image (x=%f, y=%f).\n", kp.pt.x, kp.pt.y);
95                ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
96                return;
97            }
98
99            if(kp.size <= 0.f)
100            {
101                ts->printf(cvtest::TS::LOG, "KeyPoint::size is not positive (%f).\n", kp.size);
102                ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
103                return;
104            }
105
106            if((kp.angle < 0.f && kp.angle != -1.f) || kp.angle >= 360.f)
107            {
108                ts->printf(cvtest::TS::LOG, "KeyPoint::angle is out of range [0, 360). It's %f.\n", kp.angle);
109                ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
110                return;
111            }
112        }
113        ts->set_failed_test_info(cvtest::TS::OK);
114    }
115
116    Ptr<FeatureDetector> detector;
117};
118
119
120// Registration of tests
121
122TEST(Features2d_Detector_Keypoints_BRISK, validation)
123{
124    CV_FeatureDetectorKeypointsTest test(BRISK::create());
125    test.safe_run();
126}
127
128TEST(Features2d_Detector_Keypoints_FAST, validation)
129{
130    CV_FeatureDetectorKeypointsTest test(FastFeatureDetector::create());
131    test.safe_run();
132}
133
134TEST(Features2d_Detector_Keypoints_AGAST, validation)
135{
136    CV_FeatureDetectorKeypointsTest test(AgastFeatureDetector::create());
137    test.safe_run();
138}
139
140TEST(Features2d_Detector_Keypoints_HARRIS, validation)
141{
142
143    CV_FeatureDetectorKeypointsTest test(GFTTDetector::create(1000, 0.01, 1, 3, true, 0.04));
144    test.safe_run();
145}
146
147TEST(Features2d_Detector_Keypoints_GFTT, validation)
148{
149    Ptr<GFTTDetector> gftt = GFTTDetector::create();
150    gftt->setHarrisDetector(true);
151    CV_FeatureDetectorKeypointsTest test(gftt);
152    test.safe_run();
153}
154
155TEST(Features2d_Detector_Keypoints_MSER, validation)
156{
157    CV_FeatureDetectorKeypointsTest test(MSER::create());
158    test.safe_run();
159}
160
161TEST(Features2d_Detector_Keypoints_ORB, validation)
162{
163    CV_FeatureDetectorKeypointsTest test(ORB::create());
164    test.safe_run();
165}
166
167TEST(Features2d_Detector_Keypoints_KAZE, validation)
168{
169    CV_FeatureDetectorKeypointsTest test(KAZE::create());
170    test.safe_run();
171}
172
173TEST(Features2d_Detector_Keypoints_AKAZE, validation)
174{
175    CV_FeatureDetectorKeypointsTest test_kaze(AKAZE::create(AKAZE::DESCRIPTOR_KAZE));
176    test_kaze.safe_run();
177
178    CV_FeatureDetectorKeypointsTest test_mldb(AKAZE::create(AKAZE::DESCRIPTOR_MLDB));
179    test_mldb.safe_run();
180}
181