1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 23:33:05 +04:00

Merge pull request #27915 from MaximSmolskiy:fix_ml_kdtree_findNearest

Fix ml::KDTree::findNearest
This commit is contained in:
Alexander Smorkalov
2025-10-17 12:01:12 +03:00
committed by GitHub
2 changed files with 21 additions and 3 deletions
+15 -2
View File
@@ -396,8 +396,21 @@ public:
{
Mat _res, _nr, _d;
tr.findNearest(test_samples.row(i), k, Emax, _res, _nr, _d, noArray());
res.push_back(_res.t());
_results.assign(res);
if( _results.needed() )
{
res.push_back(_res.t());
_results.assign(res);
}
if( _neighborResponses.needed() )
{
nr.push_back(_nr.t());
_neighborResponses.assign(nr);
}
if( _dists.needed() )
{
d.push_back(_d.t());
_dists.assign(d);
}
}
return result; // currently always 0
+6 -1
View File
@@ -39,11 +39,16 @@ TEST(ML_KNearest, accuracy)
{
SCOPED_TRACE("KDTree");
Mat neighborIndexes;
Mat neighborResponses;
Mat dists;
float err = 1000;
Ptr<KNearest> knn = KNearest::create();
knn->setAlgorithmType(KNearest::KDTREE);
knn->train(trainData, ml::ROW_SAMPLE, trainLabels);
knn->findNearest(testData, 4, neighborIndexes);
knn->findNearest(testData, 4, neighborIndexes, neighborResponses, dists);
EXPECT_EQ(neighborIndexes.size(), Size(4, pointsCount));
EXPECT_EQ(neighborResponses.size(), Size(4, pointsCount * 2));
EXPECT_EQ(dists.size(), Size(4, pointsCount));
Mat bestLabels;
// The output of the KDTree are the neighbor indexes, not actual class labels
// so we need to do some extra work to get actual predictions