10 # include <vcl_msvc_warnings.h> 29 cam_ids_img_pts_(std::move(cam_ids_img_pts)), pts_3d_(std::move(pts_3d)), input_cams_(input_cams), minimize_R_(minimize_R)
32 for (
const auto & input_cam : input_cams) {
53 std::vector<vpgl_perspective_camera<double> > current_cams;
59 std::vector<vnl_matrix_fixed<double, 3, 4> > current_cam_Ms;
60 current_cam_Ms.reserve(current_cams.size());
61 for (
auto & current_cam : current_cams)
62 current_cam_Ms.push_back(current_cam.get_matrix());
75 double dif0 = (current_img_pt[0]/current_img_pt[2]) - img_pt[0];
76 double dif1 = (current_img_pt[1]/current_img_pt[2]) - img_pt[1];
78 fx[cnt] = std::abs(dif0);
80 fx[cnt] = std::abs(dif1);
99 double x2 = r0*r0, y2 = r1*r1, z2 = r2*r2;
100 double m = x2 + y2 + z2;
101 double theta = std::sqrt(
m);
102 double s = std::sin(theta) / theta;
103 double c = (1 - std::cos(theta)) /
m;
106 R(0,0) = R(1,1) = R(2,2) = 1.0;
110 R(0,0) -= (y2 + z2) * c;
111 R(1,1) -= (x2 + z2) * c;
112 R(2,2) -= (x2 + y2) * c;
113 R(0,1) = R(1,0) = r0*r1*c;
114 R(0,2) = R(2,0) = r0*r2*c;
115 R(1,2) = R(2,1) = r1*r2*c;
144 for (
unsigned i = 0; i <
Ks_.size(); i++) {
154 output_cams.push_back(camt);
166 for (
unsigned i = 0; i <
Ks_.size(); i++) {
173 output_cams.push_back(camt);
182 for (
unsigned i = 0; i <
Ks_.size(); i++) {
193 output_cams.push_back(camt);
212 unsigned cnt_residuals = 0;
213 double nx = 0, ny = 0, ns = 0;
215 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
216 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
217 double x = cam_ids_img_pt[i].first[0];
218 double y = cam_ids_img_pt[i].first[1];
231 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
232 std::vector< std::pair<vnl_vector_fixed<double, 2>,
unsigned> > cam_pts;
233 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
234 double x = cam_ids_img_pt[i].first[0];
235 double y = cam_ids_img_pt[i].first[1];
237 new_pt[0] = (x-nx)/ns;
238 new_pt[1] = (y-ny)/ns;
239 std::pair<vnl_vector_fixed<double, 2>,
unsigned> pair(new_pt, cam_ids_img_pt[i].second);
240 cam_pts.push_back(pair);
242 cam_ids_norm_img_pts.push_back(cam_pts);
246 for (
const auto & input_cam : input_cams) {
254 K_vals[4] = Ki.
skew();
263 input_cams_norm.push_back(cnew);
275 unsigned cnt_residuals = 0;
276 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
277 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
281 std::cout <<
"number of residuals: " << cnt_residuals << std::endl;
284 std::vector<vpgl_perspective_camera<double> > input_cams_norm;
285 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 2>,
unsigned> > > cam_ids_norm_img_pts;
286 normalize_img_pts(input_cams, cam_ids_img_pts, input_cams_norm, cam_ids_norm_img_pts);
291 unsigned n_unknowns = 3;
309 std::vector<vpgl_perspective_camera<double> > output_cams_denorm;
316 for (
unsigned i = 0; i < output_cams_denorm.size(); i++) {
320 output_cams.push_back(cnew);
329 std::vector<vnl_vector_fixed<double, 3> > out;
330 for (
double z = -dim_z; z <= dim_z; z+=step)
331 for (
double x = -dim_x; x <= dim_x; x+=step)
332 for (
double y = -dim_y; y <= dim_y; y+=step) {
346 unsigned cnt_residuals = 0;
347 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
348 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
352 std::cout <<
"number of residuals: " << cnt_residuals << std::endl;
355 std::vector<vpgl_perspective_camera<double> > input_cams_norm;
356 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 2>,
unsigned> > > cam_ids_norm_img_pts;
357 normalize_img_pts(input_cams, cam_ids_img_pts, input_cams_norm, cam_ids_norm_img_pts);
360 double dim_x = 20.0, dim_y = 20.0, dim_z = 12.0;
362 std::vector<vnl_vector_fixed<double, 3> > offsets =
sample_centers(dim_x, dim_y, dim_z, step);
364 double error_min = 1000000000.0;
365 output_cams = input_cams;
367 for (
unsigned i = 0; i < offsets.size(); i++) {
368 if (i%500 == 0) std::cout << i <<
" ";
370 std::vector<vpgl_perspective_camera<double> > input_cams_norm_off;
371 for (
auto & j : input_cams_norm) {
377 input_cams_norm_off.push_back(cnew);
380 unsigned n_unknowns = 3;
394 std::vector<vpgl_perspective_camera<double> > output_cams_denorm;
397 if (enderror < error_min) {
398 std::cout <<
" setting output cams for offset: " << offsets[i] <<
" with min error: " << error_min << std::endl;
399 error_min = enderror;
400 offset_min = offsets[i];
402 for (
unsigned j = 0; j < output_cams_denorm.size(); j++) {
405 output_cams[j] = cnew;
409 std::cout <<
" final error min: " << error_min <<
" final offset: " << offset_min <<
" tried: " << offsets.
size() <<
" offsets!\n";
420 unsigned cnt_residuals = 0;
421 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
422 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
426 std::cout <<
"number of residuals: " << cnt_residuals << std::endl;
429 std::vector<vpgl_perspective_camera<double> > input_cams_norm;
430 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 2>,
unsigned> > > cam_ids_norm_img_pts;
431 normalize_img_pts(input_cams, cam_ids_img_pts, input_cams_norm, cam_ids_norm_img_pts);
436 std::vector<vnl_matrix_fixed<double, 3, 3> > input_cam_K_invs;
437 for (
auto & i : input_cams_norm) {
441 input_cam_K_invs.push_back(Kinv);
444 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > > cam_ids_norm_cam_pts;
445 for (
auto & cam_ids_norm_img_pt : cam_ids_norm_img_pts) {
446 std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > cam_pts;
447 for (
unsigned i = 0; i < cam_ids_norm_img_pt.size(); i++) {
449 pt[0] = cam_ids_norm_img_pt[i].first[0];
450 pt[1] = cam_ids_norm_img_pt[i].first[1];
453 cam_pt = input_cam_K_invs[cam_ids_norm_img_pt[i].second]*pt;
454 std::pair<vnl_vector_fixed<double, 3>,
unsigned> pair(cam_pt, cam_ids_norm_img_pt[i].second);
455 cam_pts.push_back(pair);
457 cam_ids_norm_cam_pts.push_back(cam_pts);
465 unsigned m = cnt_residuals*2;
471 for (
unsigned j = 0; j < cam_ids_norm_cam_pts.size(); j++) {
472 double X = pts_3d[j][0], Y = pts_3d[j][1], Z = pts_3d[j][2];
474 for (
auto & i : cam_ids_norm_cam_pts[j]) {
476 double x = pt[0];
double y = pt[1];
double z = pt[2];
477 double a = x/z;
double b = y/z;
480 double r1 = R[0][0], r2 = R[0][1], r3 = R[0][2];
481 double r4 = R[1][0], r5 = R[1][1], r6 = R[1][2];
482 double r7 = R[2][0], r8 = R[2][1], r9 = R[2][2];
484 double t1 = t.
x(), t2 = t.
y(), t3 = t.
z();
486 A(cnt, 0) = r7*X*a-r1*X; A(cnt, 1) = r7*Y*a-r1*Y; A(cnt, 2) = r7*Z*a-r1*Z;
487 A(cnt, 3) = r8*X*a-r2*X; A(cnt, 4) = r8*Y*a-r2*Y; A(cnt, 5) = r8*Z*a-r2*Z;
488 A(cnt, 6) = r9*X*a-r3*X; A(cnt, 7) = r9*Y*a-r3*Y; A(cnt, 8) = r9*Z*a-r3*Z;
489 A(cnt, 9) = r7*a-r1; A(cnt, 10) = r8*a-r2; A(cnt, 11) = r9*a-r3;
493 A(cnt, 0) = r7*X*b-r4*X; A(cnt, 1) = r7*Y*b-r4*Y; A(cnt, 2) = r7*Z*b-r4*Z;
494 A(cnt, 3) = r8*X*b-r5*X; A(cnt, 4) = r8*Y*b-r5*Y; A(cnt, 5) = r8*Z*b-r5*Z;
495 A(cnt, 6) = r9*X*b-r6*X; A(cnt, 7) = r9*Y*b-r6*Y; A(cnt, 8) = r9*Z*b-r6*Z;
496 A(cnt, 9) = r7*b-r4; A(cnt, 10) = r8*b-r5; A(cnt, 11) = r9*b-r6;
504 unknowns[0] = 1; unknowns[4] = 1; unknowns[8] = 1;
506 std::cout <<
"unknowns: " << unknowns << std::endl;
509 R_fixed[0][0] = unknowns[0]; R_fixed[0][1] = unknowns[1]; R_fixed[0][2] = unknowns[2];
510 R_fixed[1][0] = unknowns[3]; R_fixed[1][1] = unknowns[4]; R_fixed[1][2] = unknowns[5];
511 R_fixed[2][0] = unknowns[6]; R_fixed[2][1] = unknowns[7]; R_fixed[2][2] = unknowns[8];
513 std::cout <<
" R_fixed: " << R_fixed << std::endl; std::cout <<
" det of R_fixed: " <<
vnl_det(R_fixed) << std::endl;
521 std::cout <<
" t_fixed: " << t_fixed << std::endl;
525 for (
const auto & input_cam : input_cams) {
530 tv[0] = t.
x(); tv[1] = t.
y(); tv[2] = t.
z();
540 output_cams.push_back(cnew);
542 std::cout <<
" old center: " << input_cam.get_camera_center() <<
" new center: " << cnew.
get_camera_center();
556 unsigned cnt_residuals = 0;
557 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
558 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
562 std::cout <<
"number of residuals: " << cnt_residuals << std::endl;
565 std::vector<vpgl_perspective_camera<double> > input_cams_norm;
566 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 2>,
unsigned> > > cam_ids_norm_img_pts;
567 normalize_img_pts(input_cams, cam_ids_img_pts, input_cams_norm, cam_ids_norm_img_pts);
572 std::vector<vnl_matrix_fixed<double, 3, 3> > input_cam_K_invs;
573 for (
auto & i : input_cams_norm) {
577 input_cam_K_invs.push_back(Kinv);
580 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > > cam_ids_norm_cam_pts;
581 for (
auto & cam_ids_norm_img_pt : cam_ids_norm_img_pts) {
582 std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > cam_pts;
583 for (
unsigned i = 0; i < cam_ids_norm_img_pt.size(); i++) {
585 pt[0] = cam_ids_norm_img_pt[i].first[0];
586 pt[1] = cam_ids_norm_img_pt[i].first[1];
589 cam_pt = input_cam_K_invs[cam_ids_norm_img_pt[i].second]*pt;
590 std::pair<vnl_vector_fixed<double, 3>,
unsigned> pair(cam_pt, cam_ids_norm_img_pt[i].second);
591 cam_pts.push_back(pair);
593 cam_ids_norm_cam_pts.push_back(cam_pts);
601 unsigned m = cnt_residuals*2;
607 for (
unsigned j = 0; j < cam_ids_norm_cam_pts.size(); j++) {
608 double X = pts_3d[j][0], Y = pts_3d[j][1], Z = pts_3d[j][2];
610 for (
auto & i : cam_ids_norm_cam_pts[j]) {
612 double x = pt[0];
double y = pt[1];
double z = pt[2];
613 double a = x/z;
double b = y/z;
616 double r1 = R[0][0], r2 = R[0][1], r3 = R[0][2];
617 double r4 = R[1][0], r5 = R[1][1], r6 = R[1][2];
618 double r7 = R[2][0], r8 = R[2][1], r9 = R[2][2];
620 double t1 = t.
x(), t2 = t.
y();
626 B[cnt] = r1*X + r2*Y + r3*Z + t1 - r7*X*a - r8*Y*a - r9*Z*a;
632 B[cnt] = r4*X + r5*Y + r6*Z + t2 - r7*X*b - r8*Y*b - r9*Z*b;
640 std::cout <<
"unknowns: " << unknowns << std::endl;
643 std::cout <<
" t_fixed: " << t_fixed << std::endl;
647 for (
const auto & input_cam : input_cams) {
652 tv[0] = t.
x(); tv[1] = t.
y(); tv[2] = t.
z();
659 std::cout <<
" old center: " << input_cam.get_camera_center() <<
" new center: " << cnew.
get_camera_center();
662 output_cams.push_back(cnew);
677 std::cerr <<
"In vpgl_camera_transform::normalize_to_rotation_matrix() -- cannot compute eigendecomposition!\n";
680 for (
unsigned i = 0; i < 3; i++) {
681 if (std::abs(D[i]) < std::numeric_limits<double>::epsilon())
683 Dreal[i][i] = 1.0/std::sqrt(D[i]);
685 std::cout <<
"D real:\n " << Dreal << std::endl;
686 std::cout <<
"V real:\n " << Vreal << std::endl;
690 std::cout <<
"( (R^t*R)^(1/2) )^-1:\n " << out << std::endl;
693 for (
unsigned i = 0; i < 3; i++)
694 for (
unsigned j = 0; j < 3; j++)
695 R_norm[i][j] = out[i][j];
704 std::cout <<
"initial q: " << q << std::endl;
706 std::cout <<
"norm q: " << q_n << std::endl;
718 unsigned cnt_residuals = 0;
719 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
720 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
724 std::cout <<
"number of residuals: " << cnt_residuals << std::endl;
727 std::vector<vpgl_perspective_camera<double> > input_cams_norm;
728 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 2>,
unsigned> > > cam_ids_norm_img_pts;
729 normalize_img_pts(input_cams, cam_ids_img_pts, input_cams_norm, cam_ids_norm_img_pts);
734 std::vector<vnl_matrix_fixed<double, 3, 3> > input_cam_K_invs;
735 for (
auto & i : input_cams_norm) {
739 input_cam_K_invs.push_back(Kinv);
742 std::vector< std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > > cam_ids_norm_cam_pts;
743 for (
auto & cam_ids_norm_img_pt : cam_ids_norm_img_pts) {
744 std::vector < std::pair<vnl_vector_fixed<double, 3>,
unsigned> > cam_pts;
745 for (
unsigned i = 0; i < cam_ids_norm_img_pt.size(); i++) {
747 pt[0] = cam_ids_norm_img_pt[i].first[0];
748 pt[1] = cam_ids_norm_img_pt[i].first[1];
751 cam_pt = input_cam_K_invs[cam_ids_norm_img_pt[i].second]*pt;
752 std::pair<vnl_vector_fixed<double, 3>,
unsigned> pair(cam_pt, cam_ids_norm_img_pt[i].second);
753 cam_pts.push_back(pair);
755 cam_ids_norm_cam_pts.push_back(cam_pts);
763 unsigned m = cnt_residuals*2;
771 for (
unsigned j = 0; j < cam_ids_norm_cam_pts.size(); j++) {
772 double X = pts_3d[j][0], Y = pts_3d[j][1], Z = pts_3d[j][2];
774 for (
auto & i : cam_ids_norm_cam_pts[j]) {
776 double x = pt[0];
double y = pt[1];
double z = pt[2];
777 double a = x/z;
double b = y/z;
780 double r1 = R[0][0], r2 = R[0][1], r3 = R[0][2];
781 double r4 = R[1][0], r5 = R[1][1], r6 = R[1][2];
782 double r7 = R[2][0], r8 = R[2][1], r9 = R[2][2];
784 double t1 = t.
x(), t2 = t.
y(), t3 = t.
z();
786 A(cnt, 0) = r7*X*a-r1*X; A(cnt, 1) = r7*Y*a-r1*Y; A(cnt, 2) = r7*Z*a-r1*Z;
787 A(cnt, 3) = r8*X*a-r2*X; A(cnt, 4) = r8*Y*a-r2*Y; A(cnt, 5) = r8*Z*a-r2*Z;
788 A(cnt, 6) = r9*X*a-r3*X; A(cnt, 7) = r9*Y*a-r3*Y; A(cnt, 8) = r9*Z*a-r3*Z;
792 A(cnt, 0) = r7*X*b-r4*X; A(cnt, 1) = r7*Y*b-r4*Y; A(cnt, 2) = r7*Z*b-r4*Z;
793 A(cnt, 3) = r8*X*b-r5*X; A(cnt, 4) = r8*Y*b-r5*Y; A(cnt, 5) = r8*Z*b-r5*Z;
794 A(cnt, 6) = r9*X*b-r6*X; A(cnt, 7) = r9*Y*b-r6*Y; A(cnt, 8) = r9*Z*b-r6*Z;
802 unknowns[0] = 1; unknowns[4] = 1; unknowns[8] = 1;
806 std::cout <<
"unknowns: " << unknowns << std::endl;
809 R_fixed[0][0] = unknowns[0]; R_fixed[0][1] = unknowns[1]; R_fixed[0][2] = unknowns[2];
810 R_fixed[1][0] = unknowns[3]; R_fixed[1][1] = unknowns[4]; R_fixed[1][2] = unknowns[5];
811 R_fixed[2][0] = unknowns[6]; R_fixed[2][1] = unknowns[7]; R_fixed[2][2] = unknowns[8];
813 std::cout <<
" R_fixed: " << R_fixed << std::endl; std::cout <<
" det of R_fixed: " <<
vnl_det(R_fixed) << std::endl;
819 std::cout <<
" R_fixed_norm: " << R_fixed_norm << std::endl; std::cout <<
" det of R_fixed_norm: " <<
vnl_det(R_fixed_norm) << std::endl;
824 for (
const auto & input_cam : input_cams) {
829 tv[0] = t.
x(); tv[1] = t.
y(); tv[2] = t.
z();
838 output_cams.push_back(cnew);
840 std::cout <<
" old center: " << input_cam.
get_camera_center() <<
" new center: " << cnew.get_camera_center();
841 std::cout <<
" move by: " << (input_cam.get_camera_center()-cnew.get_camera_center()).
length() << std::endl;
842 std::cout <<
" old t: " << input_cam.get_translation() <<
" new t: " << cnew.get_translation() << std::endl;
853 for (
const auto & input_cam : input_cams) {
858 tv[0] = t.
x(); tv[1] = t.
y(); tv[2] = t.
z();
866 input_cam.get_camera_center().x() + t_fixed.
y(),
867 input_cam.get_camera_center().x() + t_fixed.
z());
870 output_cams.push_back(cnew);
872 std::cout <<
" old center: " << input_cam.get_camera_center() <<
" new center: " << cnew.get_camera_center();
873 std::cout <<
" move by: " << (input_cam.get_camera_center()-cnew.get_camera_center()).
length() << std::endl;
874 std::cout <<
" old t: " << input_cam.get_translation() <<
" new t: " << cnew.get_translation() << std::endl;
887 std::vector<vnl_matrix_fixed<double, 3, 3> > input_cam_K_invs;
888 for (
const auto & input_cam : input_cams) {
892 input_cam_K_invs.push_back(Kinv);
896 for (
const auto & cam_ids_img_pt : cam_ids_img_pts) {
898 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
900 pt[0] = cam_ids_img_pt[i].first[0];
901 pt[1] = cam_ids_img_pt[i].first[1];
904 cam_pt = input_cam_K_invs[cam_ids_img_pt[i].second]*pt;
915 cam_pts.push_back(pair2);
917 cam_ids_img_pts_norm.push_back(cam_pts);
933 std::vector<vnl_vector_fixed<double, 3> > cam_i_pts;
934 std::vector<vnl_matrix_fixed<double, 3, 3> > cam_i_pts_cov;
935 std::vector<vnl_vector_fixed<double, 3> > cam_j_pts;
936 std::vector<vnl_matrix_fixed<double, 3, 3> > cam_j_pts_cov;
939 for (
const auto & cam_ids_img_pt : cam_ids_img_pts)
941 for (
unsigned i = 0; i < cam_ids_img_pt.size(); i++) {
943 if (cam_ids_img_pt[i].second == cam_i) {
944 cam_i_pts.push_back(cam_ids_img_pt[i].first.first);
945 cam_i_pts_cov.push_back(cam_ids_img_pt[i].first.second);
946 }
if (cam_ids_img_pt[i].second == cam_j) {
947 cam_j_pts.push_back(cam_ids_img_pt[i].first.first);
948 cam_j_pts_cov.push_back(cam_ids_img_pt[i].first.second);
952 if (cam_i_pts.
size() != cam_j_pts.size())
955 rot_variance.
fill(0.0);
957 for (
unsigned i = 0; i < cam_i_pts.
size(); i++) {
969 std::cout <<
" \t b: " << b << std::endl;
972 std::cout <<
" \t bb: \n" << bb << std::endl;
985 hvM(0,0) = 0.0; hvM(0,1) = -hv[2]; hvM(0,2) = hv[1];
986 hvM(1,0) = hv[2]; hvM(1,1) = 0.0; hvM(1,2) = -hv[0];
987 hvM(2,0) = -hv[1]; hvM(2,1) = hv[0]; hvM(2,2) = 0.0;
995 double weight = 1.0/(t1 + t2 + t3);
996 std::cout <<
" t1: " << t1 <<
" t2: " << t2 <<
" t3: " << t3 <<
" weight: " << weight << std::endl;
998 rot_variance += weight*bb;
vgl_point_2d< T > principal_point() const
vnl_vector< T > vnl_cross_3d(const vnl_vector< T > &v1, const vnl_vector< T > &v2)
vnl_matrix_fixed< T, 3, 3 > as_matrix() const
vnl_matrix< double > transpose() const
double get_end_error() const
unsigned int size() const
const vnl_matrix< T > as_matrix() const
T vnl_trace(vnl_matrix< T > const &M)
unsigned int get_number_of_unknowns() const
vnl_matrix_fixed< T, 1, 1 > vnl_inverse(vnl_matrix_fixed< T, 1, 1 > const &m)
Several routines for computing different kinds of cameras from world-point correspondences.
VNL_EXPORT T vnl_det(T const *row0, T const *row1)
vgl_vector_3d< T > vpgl_persp_cam_base_line_vector(const vpgl_perspective_camera< T > &cam1, const vpgl_perspective_camera< T > &cam2)
vgl_rotation_3d< T > vpgl_persp_cam_relative_orientation(const vpgl_perspective_camera< T > &cam1, const vpgl_perspective_camera< T > &cam2)
compute rotation such that principal_vector1 = R*principal_vector2.
vnl_matrix_fixed< T, num_cols, num_rows > transpose() const
vnl_matrix_fixed< T, 3, 3 > get_matrix() const
Get the calibration matrix.
const vgl_point_3d< T > & get_camera_center() const
vnl_matrix_fixed & fill(T)
This class implements the perspective camera class as described in Hartley & Zisserman as a finite ca...
T dot_product(v const &a, v const &b)
vnl_vector_fixed< T, n > & normalize()
double length(v const &a)
VNL_EXPORT vnl_matrix_fixed< T, m, n > outer_product(vnl_vector_fixed< T, m > const &a, vnl_vector_fixed< T, n > const &b)
bool minimize(vnl_vector< double > &x)
bool vnl_symmetric_eigensystem_compute(vnl_matrix< T > const &A, vnl_matrix< T > &V, vnl_vector< T > &D)
int minimize(vnl_vector< double > &x)