19CascadeHashing::GlobalData::generate_proj_matrices (Options
const& opts)
21 generate_proj_matrices(
22 &this->sift.prim_proj_mat,
23 &this->sift.sec_proj_mats,
25 generate_proj_matrices(
26 &this->surf.prim_proj_mat,
27 &this->surf.sec_proj_mats,
36 ExhaustiveMatching::init(viewports);
39 this->local_data_sift.clear();
40 this->local_data_sift.resize(viewports->size());
41 this->local_data_surf.clear();
42 this->local_data_surf.resize(viewports->size());
44 this->global_data.generate_proj_matrices(this->cashash_opts);
49 compute_avg_descriptors(this->processed_feature_sets, &sift_avg, &surf_avg);
51#pragma omp parallel for schedule(dynamic)
52 for (std::size_t i = 0; i < viewports->size(); i++)
54 LocalData* ld_sift = &this->local_data_sift[i];
55 LocalData* ld_surf = &this->local_data_surf[i];
58 std::vector<math::Vec128f> sift_zero_mean_descs;
59 std::vector<math::Vec64f> surf_zero_mean_descs;
60 this->compute_zero_mean_descs(&sift_zero_mean_descs,
64 this->compute(ld_sift, ld_surf, sift_zero_mean_descs,
65 surf_zero_mean_descs, this->global_data, this->cashash_opts);
67 std::cout <<
"Computing cascade hashes took " << timer.
get_elapsed()
68 <<
" ms" << std::endl;
72CascadeHashing::pairwise_match (
int view_1_id,
int view_2_id,
78 LocalData
const& ld_sift_1 = this->local_data_sift[view_1_id];
79 LocalData
const& ld_sift_2 = this->local_data_sift[view_2_id];
83 this->twoway_match(this->opts.sift_matching_opts,
86 &sift_result, this->cashash_opts);
87 Matching::remove_inconsistent_matches(&sift_result);
91 LocalData
const& ld_surf_1 = this->local_data_surf[view_1_id];
92 LocalData
const& ld_surf_2 = this->local_data_surf[view_2_id];
96 this->twoway_match(this->opts.surf_matching_opts,
99 &surf_result, this->cashash_opts);
100 Matching::remove_inconsistent_matches(&surf_result);
103 Matching::combine_results(sift_result, surf_result, result);
107CascadeHashing::compute(
108 LocalData* ld_sift, LocalData* ld_surf,
109 std::vector<math::Vec128f>
const& sift_zero_mean_descs,
110 std::vector<math::Vec64f>
const& surf_zero_mean_descs,
111 GlobalData
const& cashash_global_data,
112 Options
const& cashash_opts)
115 compute_cascade_hashes(
116 sift_zero_mean_descs,
117 &ld_sift->comp_hash_data,
118 &ld_sift->bucket_grps_bucket_ids,
119 cashash_global_data.sift.prim_proj_mat,
120 cashash_global_data.sift.sec_proj_mats,
122 compute_cascade_hashes(
123 surf_zero_mean_descs,
124 &ld_surf->comp_hash_data,
125 &ld_surf->bucket_grps_bucket_ids,
126 cashash_global_data.surf.prim_proj_mat,
127 cashash_global_data.surf.sec_proj_mats,
132 &ld_sift->bucket_grps_feature_ids,
133 ld_sift->bucket_grps_bucket_ids,
134 sift_zero_mean_descs.size(),
137 &ld_surf->bucket_grps_feature_ids,
138 ld_surf->bucket_grps_bucket_ids,
139 surf_zero_mean_descs.size(),
146CascadeHashing::compute_avg_descriptors (ProcessedFeatureSets
const& pfs,
151 std::size_t num_sift_descs_total = 0;
152 std::size_t num_surf_descs_total = 0;
155 for (std::size_t i = 0; i < pfs.size(); i++)
157 SiftDescriptors
const& sift_descr = pfs[i].sift_descr;
158 SurfDescriptors
const& surf_descr = pfs[i].surf_descr;
160 std::size_t num_sift_descriptors = sift_descr.size();
161 std::size_t num_surf_descriptors = surf_descr.size();
162 num_sift_descs_total += num_sift_descriptors;
163 num_surf_descs_total += num_surf_descriptors;
165 for (std::size_t j = 0; j < num_sift_descriptors; j++)
166 for (
int k = 0; k < 128; k++)
167 sift_vec_sum[k] += sift_descr[j][k] / 255.0f;
169 for (std::size_t j = 0; j < num_surf_descriptors; j++)
170 for (
int k = 0; k < 64; k++)
171 surf_vec_sum[k] += surf_descr[j][k] / 127.0f;
175 *sift_avg = sift_vec_sum / num_sift_descs_total;
176 *surf_avg = surf_vec_sum / num_surf_descs_total;
180CascadeHashing::compute_zero_mean_descs(
181 std::vector<math::Vec128f>* sift_zero_mean_descs,
182 std::vector<math::Vec64f>* surf_zero_mean_descs,
183 SiftDescriptors
const& sift_descs, SurfDescriptors
const& surf_descs,
187 sift_zero_mean_descs->resize(sift_descs.size());
188 for (std::size_t i = 0; i < sift_descs.size(); i++)
189 for (
int j = 0; j < 128; j++)
190 (*sift_zero_mean_descs)[i][j] = sift_descs[i][j] / 255.0f - sift_avg[j];
192 surf_zero_mean_descs->resize(surf_descs.size());
193 for (std::size_t i = 0; i < surf_descs.size(); i++)
194 for (
int j = 0; j < 64; j++)
195 (*surf_zero_mean_descs)[i][j] = surf_descs[i][j] / 127.0f - surf_avg[j];
201CascadeHashing::build_buckets(
202 BucketGroupsFeatures *bucket_grps_feature_ids,
203 BucketGroupsBuckets
const& bucket_grps_bucket_ids,
207 uint8_t
const num_bucket_grps = opts.num_bucket_groups;
208 uint8_t
const num_bucket_bits = opts.num_bucket_bits;
209 uint32_t
const num_buckets_per_group = 1 << num_bucket_bits;
211 bucket_grps_feature_ids->resize(num_bucket_grps);
213 for (uint8_t grp_idx = 0; grp_idx < num_bucket_grps; grp_idx++)
215 BucketGroupFeatures &bucket_grp_features = (*bucket_grps_feature_ids)[grp_idx];
216 bucket_grp_features.resize(num_buckets_per_group);
217 for (
size_t i = 0; i < num_descs; i++)
219 uint16_t bucket_id = bucket_grps_bucket_ids[grp_idx][i];
220 bucket_grp_features[bucket_id].emplace_back(i);
Cross-platform high-resolution real-time timer.
std::size_t get_elapsed(void) const
Returns the milli seconds since last reset.
std::vector< Viewport > ViewportList
The list of all viewports considered for bundling.
#define SFM_NAMESPACE_END
#define SFM_NAMESPACE_BEGIN
SiftDescriptors sift_descr
SurfDescriptors surf_descr
Feature matching result reported as two lists, each with indices in the other set.