Update to 2.0.0 tree from current Fremantle build
[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 class CV_KdtreeTest : public CvTest {
12 public:
13   CV_KdtreeTest();
14   ~CV_KdtreeTest();
15 protected:
16   virtual void run( int start_from );
17 };
18
19 CV_KdtreeTest::CV_KdtreeTest()
20 : CvTest( "kd-tree", "cvFindFeatures-kd" ) {
21 }
22
23 CV_KdtreeTest::~CV_KdtreeTest() {
24 }
25
26
27 void CV_KdtreeTest::run( int /*start_from*/ ) {
28   int dims = 64;
29   int features = 2000;
30   int k = 1; // * should also test 2nd nn etc.?
31   int emax = 20;
32   double noise = .2;
33   int points = 1000;
34
35   CvRNG rng = cvRNG();
36   CvMat* desc = cvCreateMat(features, dims, CV_64FC1);
37   cvRandArr( &rng, desc, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1));
38
39   CvFeatureTree* tr = cvCreateKDTree(desc);
40   CvMat* results = cvCreateMat(points, k, CV_32SC1);
41   CvMat* dist = cvCreateMat(points, k, CV_64FC1);
42
43   CvMat* pts = cvCreateMat(points, dims, CV_64FC1);
44   std::vector<int> fmap(points);
45   for (int j = 0; j < points; ++j) {
46     int fi = cvRandInt(&rng) % features;
47     fmap[j] = fi;
48     double* f = (double*)cvPtr2D(desc, fi, 0);
49     double* p = (double*)cvPtr2D(pts, j, 0);
50     for (int k = 0; k < dims; ++ k)
51       p[k] = f[k] + cvRandReal(&rng) * noise;
52   }
53
54   cvFindFeatures(tr, pts, results, dist, k, emax);
55
56   int correct_matches = 0;
57   { // Aisle "j" to avoid error on MSVC6
58     for (int j = 0; j < points; ++j) {
59       int fi = (int)cvGetReal2D(results, j, 0);
60       if (fmap[j] == fi)
61         ++correct_matches;
62     }
63   }
64
65   double correct_perc = correct_matches / (double)points;
66   ts->printf( CvTS::LOG, "correct_perc = %d\n", correct_perc );
67   if (correct_perc < .8)
68     ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);
69
70   cvReleaseFeatureTree(tr);
71 }
72
73
74 CV_KdtreeTest kdtree_test;