当前位置: 首页 > 工具软件 > FLANN > 使用案例 >

flann

锺离阿苏
2023-12-01

install flann and lz4 from github , uninstall the default ones.

sudo apt-get remove liblz4-dev
sudo apt-get remove libflann-dev

CMakeList.txt

cmake_minimum_required(VERSION 2.8)

project(testFlann)

file(GLOB srcs *.cpp *.hpp *.cc *.h)

find_package(Flann REQUIRED)
#find_package(HDF5 REQUIRED)


include_directories(${FLANN_INCLUDE_DIRS})
#include_directories(${HDF5_INCLUDE_DIRS})

link_directories(${HDF5_LIBRARY_DIRS})

add_executable(${PROJECT_NAME} ${srcs})

target_link_libraries(${PROJECT_NAME} ${FLANN_LIBRARIES} lz4 )

# ${HDF5_LIBRARIES}

main.cpp

//============================================================================
// Name        : flann-knn-example.cpp
// Author      : Shohei Yokoyama
// Copyright   : Shizuoka University, Japan
// Description : 1st step of your FLANN application.
// Dependency  : FLANN http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN
//             : Boost http://www.boost.org/
//             : (If win) MinGW & MSYS http://www.mingw.org/
// License     : NYSL see http://www.kmonos.net/nysl/index.en.html
//============================================================================
#include <flann/flann.hpp>
#include <boost/random.hpp>
#include <iostream>
#include <iomanip>
using namespace std;
using namespace boost;

int main(int argc, char** argv) {
    const int numResult = 2;
    const int numInput = 100;
    const int numQuery = 2;
    const int dimension = 2;
    const int maxValue = 255;
    const int minValue = 0;

    mt19937 gen(static_cast<unsigned long>(time(0)));
    uniform_smallint<> dst(minValue,maxValue);
    variate_generator<mt19937&, uniform_smallint<> > rand(gen, dst);

    //Calculate the width of values
    ostringstream ss;
    ss << (numInput - 1);
    string s = ss.str();
    int lnWidth = s.length(); // for line number
    ostringstream sss;
    sss << maxValue;
    s = sss.str();
    int valWidth = s.length(); // for each values
    ostringstream ssss;
    ssss << numQuery;
    s = ssss.str();
    int qWidth = s.length(); // for query number

    cout << "Target Data:" << endl;
    int targetData[(numInput * dimension)];
    for (int i = 0; i < numInput; ++i) {
        cout.width(qWidth);
        cout.fill(' ');
        cout << ' ';
        cout << "#";
        cout.width(lnWidth);
        cout.fill('0');
        cout << i << "\t";
        for (int j = 0; j < dimension; ++j) {
            targetData[i * dimension + j] = rand();
            cout.width(valWidth);
            cout.fill(' ');
            cout << targetData[i * dimension + j] << "\t";
        }
        cout << endl;
    }
    flann::Matrix<int> dataset(targetData, numInput, dimension);
    int queryData[dimension];
    cout << endl << "Query:" << endl;
    for (int i = 0; i < numQuery; i++) {
        cout << "Q";
        cout.width(qWidth);
        cout.fill('0');
        cout << i;
        cout.width(lnWidth + 1);
        cout.fill(' ');
        cout << " " << "\t";
        for (int j = 0; j < dimension; j++) {
            queryData[(i * dimension) + j] = rand();
            cout.width(valWidth);
            cout.fill(' ');
            cout << queryData[(i * dimension) + j] << "\t";
        }
        cout << endl;
    }
    flann::Matrix<int> query(queryData, numQuery, dimension);
    flann::Matrix<int> indices(new int[query.rows * numResult], query.rows,
            numResult);
    flann::Matrix<float> dists(new float[query.rows * numResult], query.rows,
            numResult);
    // construct an randomized kd-tree index using 4 kd-trees
    flann::Index<flann::L2<int> > index(dataset, flann::KDTreeIndexParams(8));
    index.buildIndex();
    // do a knn search, using 128 checks
    index.knnSearch(query, indices, dists, numResult, flann::SearchParams(128));
    cout << endl;
    for (int q = 0; q < numQuery; q++) {
        for (int r = 0; r < numResult; r++) {
            cout << "Q";
            cout.width(qWidth);
            cout.fill('0');
            cout << q;
            cout << "#";
            cout.width(lnWidth);
            cout.fill('0');
            cout << indices[q][r] << "\t";
            for (int j = 0; j < dimension; ++j) {
                cout.width(valWidth);
                cout.fill(' ');
                cout << dataset[indices[q][r]][j] << "\t";
            }
            cout << "dist:" << dists[q][r] << endl;
        }
    }
    //delete[] dataset.ptr();
//    /delete[] query.ptr();
    delete[] indices.ptr();
    delete[] dists.ptr();
//    delete[] query.ptr();
//    delete[] dataset.ptr();
    return 0;
}
Target Data:
 #00    242  16 
 #01    210 243 
 #02    211 208 
 #03     65 180 
 #04    117 239 
 #05     52  70 
 #06    206 215 
 #07    176  45 
 #08     44 198 
 #09    170  11 
 #10    128 215 
 #11    205  59 
 #12     38 101 
 #13      6  80 
 #14    154 211 
 #15    111 225 
 #16    120  76 
 #17    244 130 
 #18    241 109 
 #19     41 182 
 #20      8 149 
 #21    207  34 
 #22     25 110 
 #23    142 102 
 #24     10 119 
 #25      0   5 
 #26    116  65 
 #27    239 134 
 #28     43 234 
 #29    225 103 
 #30     33 121 
 #31    130 130 
 #32    204 130 
 #33     53 132 
 #34    125 128 
 #35    231  35 
 #36     96 111 
 #37    199  56 
 #38    161 190 
 #39      5 224 
 #40    174 145 
 #41      6  29 
 #42     33 146 
 #43     65  41 
 #44    188 224 
 #45    207 139 
 #46    227  74 
 #47     20 245 
 #48     21 155 
 #49     36  68 
 #50    130 173 
 #51     74  93 
 #52    186 168 
 #53    102 129 
 #54     52 250 
 #55     21  49 
 #56     83 102 
 #57    255 186 
 #58    241 208 
 #59     78  29 
 #60     98 140 
 #61    185 173 
 #62    133   6 
 #63    183 195 
 #64     67  55 
 #65     27  19 
 #66    140  48 
 #67    250  88 
 #68    147 173 
 #69     62  26 
 #70     28 234 
 #71    136 107 
 #72    141 162 
 #73    203 226 
 #74    249 185 
 #75    165 162 
 #76     43 240 
 #77     54 173 
 #78     97  35 
 #79    225  39 
 #80    150  44 
 #81    134   1 
 #82     31 154 
 #83    132  40 
 #84     96 200 
 #85    234  38 
 #86     59 135 
 #87      0 141 
 #88    138 192 
 #89     34 177 
 #90    105  27 
 #91    127  81 
 #92     67 166 
 #93    162 131 
 #94    101 209 
 #95     23 171 
 #96    245 120 
 #97    226 201 
 #98    251 187 
 #99     22 225 

Query:
Q0      123 208 
Q1       22  15 

Q0#10   128 215 dist:74
Q0#15   111 225 dist:433
Q1#65    27  19 dist:41
Q1#41     6  29 dist:452
 类似资料: