opencv FLANN radiusSearch给出了不好的结果

时间:2018-02-01 07:19:45

标签: c++ opencv nearest-neighbor kdtree opencv3.1

我想进行半径搜索以找到所有有效的邻居,但它似乎给了我错误的结果。这是我的代码

#include "opencv/cv.hpp"
#include <iostream>
#include <vector>

int main () {
    // create a group of points
    std::vector<cv::Point2f> points;
    points.emplace_back(438.6, 268.8);
    points.emplace_back(439.1, 268.6);
    points.emplace_back(438.2, 268.1);
    points.emplace_back(498.3, 285.9);
    points.emplace_back(312.9, 245.9);
    points.emplace_back(313.4, 245.7);
    points.emplace_back(313.1, 245.5);
    points.emplace_back(312.5, 245.4);
    points.emplace_back(297.6, 388.1);
    points.emplace_back(291.7, 309.8);
    points.emplace_back(194.1, 369.8);
    points.emplace_back(439.9, 314.9);
    points.emplace_back(312.8, 246.0);

    // create features array
    cv::Mat_<float> features(0, 2);

    for (auto && point : points) {

        //Fill matrix
        cv::Mat row = (cv::Mat_<float>(1, 2) << point.x, point.y);
        features.push_back(row);
    }
    std::cout << features << std::endl;

    cv::flann::Index flann_index(features, cv::flann::KDTreeIndexParams());
    std::vector<float> query{ 300.6f, 268.8f };
    std::vector<int> ind;
    std::vector<float> d;
    unsigned int max_neighbours = 10;
    // Here I deliberately increase the radius to contain all the points
    double radius = 500.0;
    flann_index.radiusSearch(query, ind, d, radius, max_neighbours,
        cv::flann::SearchParams());
}

ind的输出为[0,0,0,0,0,0,0,0,0,0],全为零,这是意料之外的。

任何人都知道为什么?

= - = - = - = - = - = - = - = - = - = - =更新

int main() {

// create a group of points
std::vector<cv::Point2f> points;
points.emplace_back(438.6, 268.8);
points.emplace_back(439.1, 268.6);
points.emplace_back(438.2, 268.1);
points.emplace_back(498.3, 285.9);
points.emplace_back(312.9, 245.9);
points.emplace_back(313.4, 245.7);
points.emplace_back(313.1, 245.5);
points.emplace_back(312.5, 245.4);
points.emplace_back(297.6, 388.1);
points.emplace_back(291.7, 309.8);
points.emplace_back(194.1, 369.8);
points.emplace_back(439.9, 314.9);
points.emplace_back(312.8, 246.0);

// create features array
cv::Mat_<float> features(0, 2);

for (auto && point : points) {

    //Fill matrix
    cv::Mat row = (cv::Mat_<float>(1, 2) << point.x, point.y);
    features.push_back(row);
}
std::cout << features << std::endl;

cv::flann::GenericIndex<cvflann::L2<float> > index(features, cvflann::KDTreeIndexParams());
std::vector<float> query(438.6f, 268.8f);
std::vector<int> ind;
std::vector<float> d;
index.radiusSearch(query, ind, d, 45.f, cvflann::SearchParams());
// I can print std::vector by some method, the reader may not, so I comment this line
//std::cout << d << std::endl;
}

由于cv::flann::Index已弃用,我更改为新的API,但这一次,该程序不再适用。

2 个答案:

答案 0 :(得分:0)

如果您查看我使用here的普通FLANN示例,您会看到他们调用的是buildIndex(),而您没有。可能是吗?

尝试:

cv::flann::Index flann_index(features, cv::flann::KDTreeIndexParams());
flann_index.buildIndex();

答案 1 :(得分:0)

您必须设置 indd 的大小。