Update to 2.0.0 tree from current Fremantle build
[opencv] / tests / cv / src / aspilltree.cpp
1 // 2009-01-14, Xavier Delacour <xavier.delacour@gmail.com>
2
3 #include "cvtest.h"
4
5 #include <algorithm>
6 #include <vector>
7 #include <iostream>
8
9 class CV_SpilltreeTest : public CvTest {
10 public:
11   CV_SpilltreeTest();
12   ~CV_SpilltreeTest();
13 protected:
14   virtual void run( int start_from );
15 };
16
17 CV_SpilltreeTest::CV_SpilltreeTest()
18 : CvTest( "spill-tree", "cvFindFeatures-spill" ) {
19 }
20
21 CV_SpilltreeTest::~CV_SpilltreeTest() {
22 }
23
24
25 void CV_SpilltreeTest::run( int /*start_from*/ )
26 {
27   int dims = 64;
28   int features = 2000;
29   int k = 1; // * should also test 2nd nn etc.?
30   int emax = 20;
31   double noise = .2;
32   int points = 1000;
33
34   //  CvRNG rng = cvRNG();
35   //  CvMat* desc = cvCreateMat(features, dims, CV_64FC1);
36   //  cvRandArr( &rng, desc, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1));
37   CvRNG rng = cvRNG(0xffffffff);
38   CvMat* desc = cvCreateMat( features, dims, CV_64FC1 );
39   cvRandArr( &rng, desc, CV_RAND_UNI, cvRealScalar(-100), cvRealScalar(100) );
40
41   CvFeatureTree* tr = cvCreateSpillTree( desc, 50, .7, .2 );
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   std::cout << "correct_perc = " << correct_perc << std::endl;
69   if (correct_perc < .8)
70     ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);
71
72   cvReleaseFeatureTree(tr);
73 }
74
75
76 CV_SpilltreeTest spilltree_test;