16 # include <vcl_msvc_warnings.h> 22 auto cit = cams.begin();
23 auto rit = corrs.begin();
25 for (; cit!=cams.end() && rit!=corrs.end(); ++cit, ++rit)
29 double err = std::sqrt(std::pow(uv.
x()-uvp.
x(), 2.0) + std::pow(uv.
y()-uvp.
y(), 2));
38 return std::sqrt(std::pow(corr.
x()-uvp.
x(), 2.0) + std::pow(corr.
y()-uvp.
y(), 2));
43 std::vector<float>
const& cam_weights,
48 double error = 100000.0;
51 for (
unsigned int i = 0; i < corrs.size(); ++i) {
55 finals.push_back(
final);
59 for (
unsigned int i = 0; i < corrs.size(); ++i) {
67 std::vector<float>
const& cam_weights,
73 double error = 100000.0;
77 for (
unsigned int i = 0; i < corrs.size(); ++i) {
81 finals.push_back(
final);
86 for (
unsigned int i = 0; i < corrs.size(); ++i) {
87 for (
unsigned int j = 0; j < cams.size(); ++j) {
88 errors[k] =
error_corr(cams[j], corrs[i][j], intersections[i]);
97 for (
unsigned int params_indice : params_indices)
98 std::cout << params_indice <<
' ';
99 std::cout << std::endl;
105 if (!params_indices.size())
108 params_indices[params_indices.size()-1] += 1;
109 if (params_indices[params_indices.size()-1] == size) {
110 params_indices[params_indices.size()-1] = 0;
112 if (params_indices.size() < 2)
115 int current_i = (int)params_indices.size()-2;
116 while (current_i >= 0) {
117 params_indices[current_i] += 1;
118 if (params_indices[current_i] < size)
122 params_indices[current_i] = 0;
132 std::vector<float>
const& cam_weights,
134 double radius,
int n,
138 cam_translations.clear();
139 intersections.clear();
140 intersections.resize(corrs.size());
141 if (!cams.size() || !corrs.size() || cams.size() != corrs.size())
143 if (!corrs[0].size())
145 auto cnt_corrs_for_each_cam = (unsigned)corrs[0].size();
146 for (
unsigned int i = 1; i < corrs.size(); ++i)
147 if (corrs[i].size() != cnt_corrs_for_each_cam)
151 std::vector<vgl_point_2d<double> > temp(cams.size());
152 std::vector<std::vector<vgl_point_2d<double> > > corrs_reformatted(cnt_corrs_for_each_cam, temp);
154 for (
unsigned int i = 0; i < cnt_corrs_for_each_cam; ++i) {
155 for (
unsigned int j = 0; j < corrs.size(); ++j)
156 corrs_reformatted[i][j] = corrs[j][i];
159 std::vector<vgl_point_3d<double> > intersections_initial;
160 for (
const auto & i : corrs_reformatted) {
164 intersections_initial.push_back(pt);
168 int param_cnt = 2*(int)cams.size();
170 std::vector<double> param_values;
171 param_values.push_back(0.0);
172 for (
int i = 1; i <= n; ++i) {
176 for (
double param_value : param_values)
177 std::cout << param_value <<
' ';
181 std::vector<unsigned> params_indices(param_cnt, 0);
182 int cnt = (int)std::pow((
float)param_cnt, (float)param_values.size());
183 std::cout <<
"will try: " << cnt <<
" param combinations: ";
186 double big_value = 10000000.0;
187 double min_error = big_value;
188 std::vector<unsigned> params_indices_best(params_indices);
192 std::vector<vpgl_rational_camera<double> > current_cams(cams);
194 for (
unsigned int i = 0; i < current_cams.size(); ++i) {
196 current_cams[i].image_offset(u_off, v_off);
197 current_cams[i].set_image_offset(u_off + param_values[params_indices[i*2]], v_off + param_values[params_indices[i*2+1]]);
201 std::vector<vgl_point_3d<double> > finals;
202 double err =
re_projection_error(current_cams, cam_weights, corrs_reformatted, intersections_initial, finals);
204 if (err < min_error) {
206 params_indices_best = params_indices;
207 intersections = finals;
209 done =
increment_perm(params_indices, (
unsigned)param_values.size());
211 if (min_error < big_value) {
212 std::cout <<
" done! found global min! min error: " << min_error <<
'\n';
213 std::vector<vpgl_rational_camera<double> > current_cams(cams);
215 std::cout <<
"translations for each camera:" << std::endl;
216 for (
unsigned int i = 0; i < current_cams.size(); ++i) {
217 vgl_vector_2d<double> tr(param_values[params_indices_best[i*2]], param_values[params_indices_best[i*2+1]]);
218 std::cout << tr << std::endl;
219 cam_translations.push_back(tr);
221 current_cams[i].image_offset(u_off,v_off);
222 current_cams[i].set_image_offset(u_off + param_values[params_indices_best[i*2]], v_off + param_values[params_indices_best[i*2+1]]);
226 std::cout <<
" done! no global min!\n";
234 std::vector<float> cam_weights,
238 initial_pts_(std::move(initial_pts)),
240 cam_weights_(std::move(cam_weights)),
248 std::vector<vpgl_rational_camera<double> > current_cams(
cameras_);
250 for (
unsigned int i = 0; i < current_cams.size(); ++i) {
252 current_cams[i].image_offset(u_off, v_off);
253 current_cams[i].set_image_offset(u_off + translation[i*2], v_off + translation[i*2+1]);
268 std::vector<float>
const& cam_weights,
273 cam_translations.clear();
274 intersections.clear();
275 intersections.resize(corrs.size());
276 if (!cams.size() || !corrs.size() || cams.size() != corrs.size())
278 if (!corrs[0].size())
280 auto cnt_corrs_for_each_cam = (unsigned)corrs[0].size();
281 for (
unsigned int i = 1; i < corrs.size(); ++i)
282 if (corrs[i].size() != cnt_corrs_for_each_cam)
286 std::vector<vgl_point_2d<double> > temp(cams.size());
287 std::vector<std::vector<vgl_point_2d<double> > > corrs_reformatted(cnt_corrs_for_each_cam, temp);
289 for (
unsigned int i = 0; i < cnt_corrs_for_each_cam; ++i) {
290 for (
unsigned int j = 0; j < corrs.size(); ++j)
291 corrs_reformatted[i][j] = corrs[j][i];
294 std::vector<vgl_point_3d<double> > intersections_initial;
295 for (
const auto & i : corrs_reformatted) {
299 intersections_initial.push_back(pt);
302 for (
unsigned int i = 0; i < corrs_reformatted.size(); ++i) {
306 intersections_initial[i] =
final;
308 for (
const auto & i : intersections_initial)
309 std::cout <<
"before adjustment initial 3D intersection point: " << i << std::endl;
326 std::cout <<
"Minimization x epsilon: " << levmarq.
get_f_tolerance() << std::endl;
332 std::cout <<
"final translations:" << std::endl;
333 for (
unsigned int i = 0; i < cams.size(); ++i) {
336 if (cam_weights[i] == 1.0f) {
337 cam_translations.push_back(trans);
339 trans.
set(translations[2*i], translations[2*i+1]);
340 cam_translations.push_back(trans);
343 if (std::abs(trans.
x()) > 200 || std::abs(trans.
y()) > 200) {
344 std::cerr <<
" trans: " << trans <<
" failed sanity check! returning false!\n";
347 std::cout << trans <<
'\n';
354 std::vector<float>
const& cam_weights,
361 double const relative_diameter)
363 cam_translations.clear();
364 intersections.clear();
365 intersections.clear();
366 intersections.resize(corrs.size());
367 if (!cams.size() || !corrs.size() || cams.size() != corrs.size())
369 if (!corrs[0].size())
371 auto cnt_corrs_for_each_cam = (unsigned)corrs[0].size();
372 for (
unsigned i = 1; i < corrs.size(); ++i)
373 if (corrs[i].size() != cnt_corrs_for_each_cam)
377 std::vector<vgl_point_2d<double> > temp(cams.size());
378 std::vector<std::vector<vgl_point_2d<double> > > corrs_reformatted(cnt_corrs_for_each_cam, temp);
380 for (
unsigned int i = 0; i < cnt_corrs_for_each_cam; ++i) {
381 for (
unsigned int j = 0; j < corrs.size(); ++j)
382 corrs_reformatted[i][j] = corrs[j][i];
385 std::vector<vgl_point_3d<double> > intersections_initial;
386 for (
const auto & i : corrs_reformatted) {
390 intersections_initial.push_back(pt);
394 for (
unsigned i = 0; i < corrs_reformatted.size(); i++) {
398 intersections_initial[i] =
final;
400 for (
const auto & i : intersections_initial)
401 std::cout <<
"before adjustment initial 3D intersection point: " << i << std::endl;
416 std::cout <<
"Minimization x epsilon: " << levmarq.
get_f_tolerance() << std::endl;
422 std::cout <<
"final translations:" << std::endl;
423 for (
unsigned i = 0; i < cams.size(); i++) {
426 if (cam_weights[i] == 1.0f) {
427 cam_translations.push_back(trans);
430 trans.
set(translations[2*i], translations[2*i+1]);
431 cam_translations.push_back(trans);
433 if (std::abs(trans.
x()) > 200 || std::abs(trans.
y()) > 200) {
434 std::cerr <<
" trans: " << trans <<
" failed sanity check! returning false!\n";
437 std::cout << trans <<
'\n';
void set_f_tolerance(double v)
vgl_homg_point_3d< Type > intersection(l const &l1, l const &l2)
This algorithm finds a set of minimum translations that registers the input set of images using multi...
static bool adjust_lev_marq(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< float > const &cam_weights, std::vector< std::vector< vgl_point_2d< double > > > const &corrs, std::vector< vgl_vector_2d< double > > &cam_translations, std::vector< vgl_point_3d< double > > &intersections)
run Lev-Marq optimization to search the param space to find the best parameter setting.
std::vector< float > cam_weights_
static bool adjust(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< float > const &cam_weights, std::vector< std::vector< vgl_point_2d< double > > > const &corrs, double radius, int n, std::vector< vgl_vector_2d< double > > &cam_translations, std::vector< vgl_point_3d< double > > &intersections)
exhaustively searches the parameter space to find the best parameter setting.
void set_verbose(bool verb)
void get_finals(std::vector< vgl_point_3d< double > > &finals)
std::vector< std::vector< vgl_point_2d< double > > > corrs_
void f(vnl_vector< double > const &translation, vnl_vector< double > &projection_errors) override
The main function.
double get_f_tolerance() const
double compute_projection_error(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< vgl_point_2d< double > > const &corrs, vgl_point_3d< double > &intersection)
void set_max_function_evals(int v)
vnl_vector & fill(double const &v)
void increment(vnl_bignum &bnum)
static bool find_intersection_point(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< float > const &cam_weights, std::vector< vgl_point_2d< double > > const &corrs, vgl_point_3d< double > &p_3d)
Find the 3-d point closest to the intersection of rays from >= 2 cameras.
Adjust image offsets to register a set of rational cameras.
vpgl_cam_trans_search_lsqr()
bool increment_perm(std::vector< unsigned > ¶ms_indices, unsigned size)
to generate the permutations, always increment the one at the very end by one; if it exceeds max,...
void set_epsilon_function(double v)
double error_corr(vpgl_rational_camera< double > const &cam, vgl_point_2d< double > const &corr, vgl_point_3d< double > const &intersection)
void diagnose_outcome() const
void print_perm(std::vector< unsigned > ¶ms_indices)
static bool refine_intersection_pt(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< float > const &cam_weights, std::vector< vgl_point_2d< double > > const &image_pts, vgl_point_3d< double > const &initial_pt, vgl_point_3d< double > &final_pt, double const &relative_diameter=1.0)
std::vector< vgl_point_3d< double > > finals_
std::vector< vgl_point_3d< double > > initial_pts_
std::vector< vpgl_rational_camera< double > > cameras_
bool minimize(vnl_vector< double > &x)
double re_projection_error(std::vector< vpgl_rational_camera< double > > const &cams, std::vector< float > const &cam_weights, std::vector< std::vector< vgl_point_2d< double > > > const &corrs, std::vector< vgl_point_3d< double > > const &intersections, std::vector< vgl_point_3d< double > > &finals)
assumes an initial estimate for intersection values, only refines the intersection and computes a re-...
Methods for back_projecting from cameras to 3-d geometric structures.
Adjust image offsets to register a set of rational cameras using multiple correspondence points.
void project(const T x, const T y, const T z, T &u, T &v) const override
The generic camera interface. u represents image column, v image row.
void set_x_tolerance(double v)