@@ -7,30 +7,28 @@ freak_params = FREAK([pattern_scale = 22.0])
77|----------|------|-------------|
88| **pattern_scale** | Float64 | Scaling factor for the sampling window |
99"""
10- type FREAK{S, T, O} <: DescriptorParams
10+ type FREAK <: Params
1111 pattern_scale:: Float64
12- pattern_table:: Array{Array{S, 1}, 1 }
13- smoothing_table:: Array{T, 1 }
14- orientation_weights:: Array{O, 1 }
12+ pattern_table:: Vector{Vector{SamplePair} }
13+ smoothing_table:: Vector{Vector{Float16} }
14+ orientation_weights:: Vector{OrientationWeights }
1515end
1616
17- typealias OrientationPair Vector{Int}
18- typealias SamplePair Vector{Float64}
19-
2017function FREAK (; pattern_scale:: Float64 = 22.0 )
2118 pattern_table, smoothing_table = _freak_tables (pattern_scale)
22- orientation_weights = OrientationPair []
19+ orientation_weights = OrientationWeights []
2320 for o in freak_orientation_sampling_pattern
2421 offset_1 = pattern_table[1 ][o[1 ]]
2522 offset_2 = pattern_table[1 ][o[2 ]]
26- dy, dx = offset_1 - offset_2
23+ dy = offset_1[1 ] - offset_2[1 ]
24+ dx = offset_1[2 ] - offset_2[2 ]
2725 norm = (dx ^ 2 + dy ^ 2 )
28- push! (orientation_weights, OrientationPair ([ round (Int, dy * 4096 / norm), round (Int, dx * 4096 / norm)] ))
26+ push! (orientation_weights, OrientationWeights (( dy / norm, dx / norm)))
2927 end
3028 FREAK (pattern_scale, pattern_table, smoothing_table, orientation_weights)
3129end
3230
33- function _freak_mean_intensity {T<:Gray} (int_img:: AbstractArray{T, 2} , keypoint:: Keypoint , offset:: SamplePair , sigma:: Float64 )
31+ function _freak_mean_intensity {T<:Gray} (int_img:: AbstractArray{T, 2} , keypoint:: Keypoint , offset:: SamplePair , sigma:: Float16 )
3432 y = keypoint[1 ] + offset[1 ]
3533 x = keypoint[2 ] + offset[2 ]
3634 if sigma < 0.5
@@ -45,15 +43,15 @@ function _freak_mean_intensity{T<:Gray}(int_img::AbstractArray{T, 2}, keypoint::
4543end
4644
4745function _freak_orientation {T<:Gray} (int_img:: AbstractArray{T, 2} , keypoint:: Keypoint , pattern:: Array{SamplePair} ,
48- orientation_weights:: Array{OrientationPair } , sigmas:: Array{Float64 } )
46+ orientation_weights:: Array{OrientationWeights } , sigmas:: Array{Float16 } )
4947 direction_sum_y = 0.0
5048 direction_sum_x = 0.0
5149 for (i, o) in enumerate (freak_orientation_sampling_pattern)
5250 offset_1 = pattern[o[1 ]]
5351 offset_2 = pattern[o[2 ]]
5452 intensity_diff = _freak_mean_intensity (int_img, keypoint, offset_1, sigmas[o[1 ]]) - _freak_mean_intensity (int_img, keypoint, offset_2, sigmas[o[2 ]])
55- direction_sum_y += orientation_weights[i][1 ] * intensity_diff / 4096
56- direction_sum_x += orientation_weights[i][2 ] * intensity_diff / 4096
53+ direction_sum_y += orientation_weights[i][1 ] * intensity_diff
54+ direction_sum_x += orientation_weights[i][2 ] * intensity_diff
5755 end
5856 angle = atan2 (direction_sum_y, direction_sum_x)
5957 scaled_angle = ceil (Int, (angle + pi ) * freak_orientation_steps / (2 * pi ))
6260
6361function _freak_tables (pattern_scale:: Float64 )
6462 pattern_table = Vector{SamplePair}[]
65- smoothing_table = Vector{Float64 }[]
63+ smoothing_table = Vector{Float16 }[]
6664 for ori in 0 : freak_orientation_steps - 1
6765 theta = ori * 2 * pi / freak_orientation_steps
6866 pattern = SamplePair[]
69- sigmas = Float64 []
67+ sigmas = Float16 []
7068 for (i, n) in enumerate (freak_num_circular_pattern)
7169 for circle_number in 0 : n - 1
7270 alt_offset = (pi / n) * ((i - 1 ) % 2 )
7371 angle = (circle_number * 2 * pi / n) + alt_offset + theta
7472
75- push! (pattern, SamplePair ([ freak_radii[i] * sin (angle) * pattern_scale,
76- freak_radii[i] * cos (angle) * pattern_scale] ))
73+ push! (pattern, SamplePair (( freak_radii[i] * sin (angle) * pattern_scale,
74+ freak_radii[i] * cos (angle) * pattern_scale) ))
7775 push! (sigmas, freak_sigma[i] * pattern_scale)
7876 end
7977 end
@@ -88,10 +86,9 @@ function create_descriptor{T<:Gray}(img::AbstractArray{T, 2}, keypoints::Keypoin
8886 descriptors = BitArray{1 }[]
8987 ret_keypoints = Keypoint[]
9088 window_size = ceil (Int, (freak_radii[1 ] + freak_sigma[1 ]) * params. pattern_scale) + 1
91- tl_lim = CartesianIndex (- window_size, - window_size)
92- br_lim = CartesianIndex (window_size, window_size)
89+ lim = CartesianIndex (window_size, window_size)
9390 for k in keypoints
94- checkbounds (Bool, img, k + tl_lim ) && checkbounds (Bool, img, k + br_lim ) || continue
91+ checkbounds (Bool, img, k - lim ) && checkbounds (Bool, img, k + lim ) || continue
9592 orientation = _freak_orientation (int_img, k, params. pattern_table[1 ], params. orientation_weights, params. smoothing_table[1 ])
9693 sampled_intensities = T[]
9794 for (i, p) in enumerate (params. pattern_table[orientation])
0 commit comments