From 2c4ae93094a070735d2e3ccbbefde71ba098feae Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Mon, 1 Jan 2018 20:49:35 +0530 Subject: [PATCH 1/6] added support for both windows and unix --- REQUIRE | 3 +++ src/ImageFeatures.jl | 2 ++ src/core.jl | 38 ++++++++++++++++++++++++++++++++------ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/REQUIRE b/REQUIRE index 58e10fa..9b1d97e 100644 --- a/REQUIRE +++ b/REQUIRE @@ -4,3 +4,6 @@ Images 0.6 Distributions 0.12 FixedPointNumbers 0.3 Compat 0.17 +FLANN +NearestNeighbors +Distances diff --git a/src/ImageFeatures.jl b/src/ImageFeatures.jl index 8063d9a..00bf9a0 100644 --- a/src/ImageFeatures.jl +++ b/src/ImageFeatures.jl @@ -5,6 +5,8 @@ module ImageFeatures # package code goes here using Images, ColorTypes, FixedPointNumbers, Distributions using Compat +using FLANN, Distances +using NearestNeighbors include("core.jl") include("const.jl") diff --git a/src/core.jl b/src/core.jl index b991ac7..de9f451 100644 --- a/src/core.jl +++ b/src/core.jl @@ -94,13 +94,39 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1, l_key = keypoints_1 order = true end - hamming_distances = [hamming_distance(s, l) for s in smaller, l in larger] + matches = Keypoints[] - for i in 1:length(smaller) - if any(hamming_distances[i, :] .< threshold) - id_min = indmin(hamming_distances[i, :]) - push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) - hamming_distances[:, id_min] = 1.0 + + ndims=length(larger[1]) + n_large=length(larger) + n_small=length(smaller) + + data=Matrix{Float64}(ndims, n_large); + for i in 1:ndims + for j in 1:n_large + data[i,j]=larger[j][i]?1:0 + end + end + + if is_windows() && Sys.WORD_SIZE==32 + tree = KDTree(data, Cityblock()) + + for i in 1:n_small + idx, dist = NearestNeighbors.knn(tree, smaller[i], 1) + if dist[1]/ndims < threshold + id_min = idx[1] + push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) + end + end + else + tree = flann(data, FLANNParameters(), Cityblock()) + + for i in 1:n_small + idx, dist = FLANN.knn(tree, Vector{Float64}(smaller[i]), 1) + if dist[1]/ndims < threshold + id_min = idx[1] + push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) + end end end matches From 9c50c360cece66503e31175f172bfef0e5a48e7c Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Tue, 2 Jan 2018 17:52:41 +0530 Subject: [PATCH 2/6] remove duplicate matches --- REQUIRE | 1 - src/ImageFeatures.jl | 1 - src/core.jl | 50 ++++++++++++++++++++++++-------------------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/REQUIRE b/REQUIRE index 9b1d97e..18f973d 100644 --- a/REQUIRE +++ b/REQUIRE @@ -5,5 +5,4 @@ Distributions 0.12 FixedPointNumbers 0.3 Compat 0.17 FLANN -NearestNeighbors Distances diff --git a/src/ImageFeatures.jl b/src/ImageFeatures.jl index 00bf9a0..4b7f441 100644 --- a/src/ImageFeatures.jl +++ b/src/ImageFeatures.jl @@ -6,7 +6,6 @@ module ImageFeatures using Images, ColorTypes, FixedPointNumbers, Distributions using Compat using FLANN, Distances -using NearestNeighbors include("core.jl") include("const.jl") diff --git a/src/core.jl b/src/core.jl index de9f451..ecf9aa1 100644 --- a/src/core.jl +++ b/src/core.jl @@ -87,6 +87,7 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1, s_key = keypoints_1 l_key = keypoints_2 order = false + if length(desc_1) > length(desc_2) smaller = desc_2 larger = desc_1 @@ -97,38 +98,41 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1, matches = Keypoints[] - ndims=length(larger[1]) - n_large=length(larger) - n_small=length(smaller) - - data=Matrix{Float64}(ndims, n_large); - for i in 1:ndims - for j in 1:n_large - data[i,j]=larger[j][i]?1:0 - end - end - if is_windows() && Sys.WORD_SIZE==32 - tree = KDTree(data, Cityblock()) - - for i in 1:n_small - idx, dist = NearestNeighbors.knn(tree, smaller[i], 1) - if dist[1]/ndims < threshold - id_min = idx[1] + hamming_distances = [hamming_distance(s, l) for s in smaller, l in larger] + for i in 1:length(smaller) + if any(hamming_distances[i, :] .< threshold) + id_min = indmin(hamming_distances[i, :]) push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) + hamming_distances[:, id_min] = 1.0 end - end + end else - tree = flann(data, FLANNParameters(), Cityblock()) + ndims=length(larger[1]) + n_large=length(larger) + n_small=length(smaller) + data=Matrix{Float64}(ndims, n_large); + for i in 1:ndims + for j in 1:n_large + data[i,j]=larger[j][i]?1:0 + end + end + tree = flann(data, FLANNParameters(), Cityblock()) + matched = zeros(Bool, n_large) for i in 1:n_small - idx, dist = FLANN.knn(tree, Vector{Float64}(smaller[i]), 1) - if dist[1]/ndims < threshold - id_min = idx[1] - push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) + idx = inrange(tree, Vector{Float64}(smaller[i]), 0.1) + for j in idx[1] + if !matched[j] + id_min = j + push!(matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]]) + matched[j] = true + break + end end end end + matches end From 049caa6129389a47d512ab0f0998181a455e82fd Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Tue, 2 Jan 2018 18:31:37 +0530 Subject: [PATCH 3/6] minor change --- src/ImageFeatures.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ImageFeatures.jl b/src/ImageFeatures.jl index 4b7f441..267eaf9 100644 --- a/src/ImageFeatures.jl +++ b/src/ImageFeatures.jl @@ -5,7 +5,9 @@ module ImageFeatures # package code goes here using Images, ColorTypes, FixedPointNumbers, Distributions using Compat -using FLANN, Distances +if !is_windows() || Sys.WORD_SIZE!=32 + using FLANN, Distances +end include("core.jl") include("const.jl") From 237252735684acd7c4df35416af7c6505293cf47 Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Tue, 2 Jan 2018 19:02:03 +0530 Subject: [PATCH 4/6] updated travel.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 94fafb7..ca6cd93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ script: # used in tests and Documentation (just install once) - julia -e 'Pkg.add("TestImages")' - julia -e 'if is_linux() Pkg.add("ImageMagick") end' + - julia -e 'Pkg.clone("https://github.com/wildart/FLANN.jl"); Pkg.build("FLANN")' - julia -e 'Pkg.test("ImageFeatures", coverage=true)' after_success: - julia -e 'cd(Pkg.dir("ImageFeatures")); Pkg.add("Coverage"); using Coverage; Codecov.submit(Codecov.process_folder())' From 75ad4528542d7feb94b72efa38da4301991bdf69 Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Tue, 2 Jan 2018 19:03:23 +0530 Subject: [PATCH 5/6] updated travel.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ca6cd93..9f71b63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,11 +9,11 @@ notifications: email: false script: - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi + - julia -e 'Pkg.clone("https://github.com/wildart/FLANN.jl"); Pkg.build("FLANN")' - julia -e 'Pkg.clone(pwd()); Pkg.build("ImageFeatures")' # used in tests and Documentation (just install once) - julia -e 'Pkg.add("TestImages")' - julia -e 'if is_linux() Pkg.add("ImageMagick") end' - - julia -e 'Pkg.clone("https://github.com/wildart/FLANN.jl"); Pkg.build("FLANN")' - julia -e 'Pkg.test("ImageFeatures", coverage=true)' after_success: - julia -e 'cd(Pkg.dir("ImageFeatures")); Pkg.add("Coverage"); using Coverage; Codecov.submit(Codecov.process_folder())' From e1cfe373672979faf4aab0f2dabea42eddd1484b Mon Sep 17 00:00:00 2001 From: tejus-gupta Date: Tue, 2 Jan 2018 19:37:26 +0530 Subject: [PATCH 6/6] updated appveyor --- appveyor.yml | 1 + src/core.jl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a939d2c..04ca762 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,6 +28,7 @@ build_script: # Need to convert from shallow to complete for Pkg.clone to work - IF EXIST .git\shallow (git fetch --unshallow) - C:\projects\julia\bin\julia -e "versioninfo(); + Pkg.clone("https://github.com/wildart/FLANN.jl"); Pkg.build("FLANN"); Pkg.clone(pwd(), \"ImageFeatures\"); Pkg.build(\"ImageFeatures\")" test_script: diff --git a/src/core.jl b/src/core.jl index ecf9aa1..618175a 100644 --- a/src/core.jl +++ b/src/core.jl @@ -121,7 +121,7 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1, tree = flann(data, FLANNParameters(), Cityblock()) matched = zeros(Bool, n_large) for i in 1:n_small - idx = inrange(tree, Vector{Float64}(smaller[i]), 0.1) + idx = inrange(tree, Vector{Float64}(smaller[i]), threshold*ndims) for j in idx[1] if !matched[j] id_min = j