1 // 2009-01-14, Xavier Delacour <xavier.delacour@gmail.com>
5 // * add test for cvFindFeaturesBoxed
13 class CV_KdtreeTest : public CvTest {
18 virtual void run( int start_from );
21 CV_KdtreeTest::CV_KdtreeTest()
22 : CvTest( "kd-tree", "cvFindFeatures-kd" ) {
25 CV_KdtreeTest::~CV_KdtreeTest() {
29 void CV_KdtreeTest::run( int /*start_from*/ ) {
32 int k = 1; // * should also test 2nd nn etc.?
38 CvMat* desc = cvCreateMat(features, dims, CV_64FC1);
39 cvRandArr( &rng, desc, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1));
41 CvFeatureTree* tr = cvCreateKDTree(desc);
42 CvMat* results = cvCreateMat(points, k, CV_32SC1);
43 CvMat* dist = cvCreateMat(points, k, CV_64FC1);
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;
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;
56 cvFindFeatures(tr, pts, results, dist, k, emax);
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);
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);
72 cvReleaseFeatureTree(tr);
75 CV_KdtreeTest kdtree_test;
79 // ----------------------------- test for cv::KDTree -----------------------
80 class KDTreeTest : public CvTest {
85 virtual void run( int start_from );
88 KDTreeTest::KDTreeTest()
89 : CvTest( "cpp_kdtree", "cv::KDTree funcs" )
92 KDTreeTest::~KDTreeTest()
96 void KDTreeTest::run( int /*start_from*/ ) {
98 int featuresCount = 2000;
99 int K = 1; // * should also test 2nd nn etc.?
102 int pointsCount = 1000;
105 Mat desc( featuresCount, dims, CV_32FC1 );
106 rng.fill( desc, RNG::UNIFORM, Scalar(0.0f), Scalar(1.0f) );
109 Mat pts( pointsCount, dims, CV_32FC1 );
110 Mat results( pointsCount, K, CV_32SC1 );
112 std::vector<int> fmap( pointsCount );
113 for( int pi = 0; pi < pointsCount; pi++ )
115 int fi = rng.next() % featuresCount;
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) );
122 int correctMatches = 0;
123 for( int pi = 0; pi < pointsCount; pi++ )
125 if( fmap[pi] == results.at<int>(pi, 0) )
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);
135 KDTreeTest cpp_kdtree_test;