]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/tests/cv/src/akdtree.cpp
git-svn-id: https://code.ros.org/svn/opencv/trunk@2338 73c94f0f-984f-4a5f-82bc-2d8db8...
[opencv.git] / opencv / tests / cv / src / akdtree.cpp
1 // 2009-01-14, Xavier Delacour <xavier.delacour@gmail.com>
2
3 #include "cvtest.h"
4
5 // * add test for cvFindFeaturesBoxed
6
7 #include <algorithm>
8 #include <vector>
9 #include <iostream>
10
11 using namespace cv;
12
13 class CV_KdtreeTest : public CvTest {
14 public:
15   CV_KdtreeTest();
16   ~CV_KdtreeTest();
17 protected:
18   virtual void run( int start_from );
19 };
20
21 CV_KdtreeTest::CV_KdtreeTest()
22 : CvTest( "kd-tree", "cvFindFeatures-kd" ) {
23 }
24
25 CV_KdtreeTest::~CV_KdtreeTest() {
26 }
27
28
29 void CV_KdtreeTest::run( int /*start_from*/ ) {
30   int dims = 64;
31   int features = 2000;
32   int k = 1; // * should also test 2nd nn etc.?
33   int emax = 20;
34   double noise = .2;
35   int points = 1000;
36
37   CvRNG rng = cvRNG();
38   CvMat* desc = cvCreateMat(features, dims, CV_64FC1);
39   cvRandArr( &rng, desc, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1));
40
41   CvFeatureTree* tr = cvCreateKDTree(desc);
42   CvMat* results = cvCreateMat(points, k, CV_32SC1);
43   CvMat* dist = cvCreateMat(points, k, CV_64FC1);
44
45   CvMat* pts = cvCreateMat(points, dims, CV_64FC1);
46   std::vector<int> fmap(points);
47   for (int j = 0; j < points; ++j) {
48     int fi = cvRandInt(&rng) % features;
49     fmap[j] = fi;
50     double* f = (double*)cvPtr2D(desc, fi, 0);
51     double* p = (double*)cvPtr2D(pts, j, 0);
52     for (int k = 0; k < dims; ++ k)
53       p[k] = f[k] + cvRandReal(&rng) * noise;
54   }
55
56   cvFindFeatures(tr, pts, results, dist, k, emax);
57
58   int correct_matches = 0;
59   { // Aisle "j" to avoid error on MSVC6
60     for (int j = 0; j < points; ++j) {
61       int fi = (int)cvGetReal2D(results, j, 0);
62       if (fmap[j] == fi)
63         ++correct_matches;
64     }
65   }
66
67   double correct_perc = correct_matches / (double)points;
68   ts->printf( CvTS::LOG, "correct_perc = %d\n", correct_perc );
69   if (correct_perc < .8)
70     ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);
71
72   cvReleaseFeatureTree(tr);
73 }
74
75 CV_KdtreeTest kdtree_test;
76
77
78
79 // ----------------------------- test for cv::KDTree -----------------------
80 class KDTreeTest : public CvTest {
81 public:
82     KDTreeTest();
83     ~KDTreeTest();
84 protected:
85     virtual void run( int start_from );
86 };
87
88 KDTreeTest::KDTreeTest()
89 : CvTest( "cpp_kdtree", "cv::KDTree funcs" )
90 {
91 }
92 KDTreeTest::~KDTreeTest() 
93 {
94 }
95
96 void KDTreeTest::run( int /*start_from*/ ) {
97     int dims = 64;
98     int featuresCount = 2000;
99     int K = 1; // * should also test 2nd nn etc.?
100     int emax = 2000;
101     float noise = 0.2f;
102     int pointsCount = 1000;
103
104     RNG rng;
105     Mat desc( featuresCount, dims, CV_32FC1 );
106     rng.fill( desc, RNG::UNIFORM, Scalar(0.0f), Scalar(1.0f) );
107
108     KDTree tr( desc );
109     Mat pts( pointsCount, dims, CV_32FC1 );
110     Mat results( pointsCount, K, CV_32SC1 );
111
112     std::vector<int> fmap( pointsCount );
113     for( int pi = 0; pi < pointsCount; pi++ )
114     {
115         int fi = rng.next() % featuresCount;
116         fmap[pi] = fi;
117         for( int d = 0; d < dims; d++ )
118             pts.at<float>(pi, d) = desc.at<float>(fi, d) + rng.uniform(0.0f, 1.0f) * noise;
119         tr.findNearest( pts.ptr<float>(pi), K, emax, results.ptr<int>(pi) );
120     }
121
122     int correctMatches = 0;
123     for( int pi = 0; pi < pointsCount; pi++ )
124     {
125         if( fmap[pi] == results.at<int>(pi, 0) )
126             correctMatches++;
127     }
128
129     double correctPerc = correctMatches / (double)pointsCount;
130     ts->printf( CvTS::LOG, "correct_perc = %d\n", correctPerc );
131     if (correctPerc < .8)
132         ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);
133 }
134
135 KDTreeTest cpp_kdtree_test;
136