Compute the pose of a 3D object using the Dementhon, Lagrange and Non-Linear approach.
#include <visp3/core/vpCameraParameters.h>
#include <visp3/core/vpMeterPixelConversion.h>
#include <visp3/core/vpPixelMeterConversion.h>
#include <visp3/core/vpDebug.h>
#include <visp3/core/vpGaussRand.h>
#include <visp3/core/vpHomogeneousMatrix.h>
#include <visp3/core/vpMath.h>
#include <visp3/core/vpPoint.h>
#include <visp3/core/vpRotationMatrix.h>
#include <visp3/core/vpRxyzVector.h>
#include <visp3/core/vpTranslationVector.h>
#include <visp3/vision/vpPose.h>
#include <stdio.h>
#include <stdlib.h>
#define L 0.035
#define L2 0.1
const std::string &legend, const double &translation3DThresh, const double &rotationRadian3DThresh, const double &pose2DThresh, const double &posePixThresh);
const std::string &legend)
{
return compare_pose(pose, cMo_ref, cMo_est, cam,
legend, 0.001, 0.001, 0.001, 1.);
}
{
std::cout << std::endl
<< legend << "\n "
<< "tx = " << cpo[0] << "\n "
<< "ty = " << cpo[1] << "\n "
<< "tz = " << cpo[2] << "\n "
<<
"tux = vpMath::rad(" <<
vpMath::deg(cpo[3]) <<
")\n "
<<
"tuy = vpMath::rad(" <<
vpMath::deg(cpo[4]) <<
")\n "
<<
"tuz = vpMath::rad(" <<
vpMath::deg(cpo[5]) <<
")\n"
<< std::endl;
}
const std::string &legend, const double &translation3DThresh, const double &rotation3DThresh, const double &pose2DThresh, const double &posePixThresh)
{
int fail_3d = 0;
for (unsigned int i = 0; i < 6; i++) {
double pose3DThresh = 0.;
if (i < 3) {
pose3DThresh = translation3DThresh;
}
else {
pose3DThresh = rotation3DThresh;
}
if (std::fabs(pose_ref[i] - pose_est[i]) > pose3DThresh) {
fail_3d = 1;
std::cout << "ref[" << i << "] - est[" << i << "] = " << pose_ref[i] - pose_est[i] << " > " << pose3DThresh << std::endl;
}
}
std::cout << "Based on 3D parameters " << legend << " is " << (fail_3d ? "badly" : "well") << " estimated" << std::endl;
if (pose.
listP.size() < 4) {
fail_3d = 1;
std::cout << "Not enough point" << std::endl;
return fail_3d;
}
r = sqrt(r / pose.
listP.size());
int fail_2d = (r > pose2DThresh) ? 1 : 0;
std::cout << "Based on 2D residual (" << r << ") " << legend << " is " << (fail_2d ? "badly" : "well") << " estimated"
<< std::endl;
r_pix = sqrt(r_pix / pose.
listP.size());
int fail_pix = (r_pix > posePixThresh) ? 1 : 0;
std::cout << "Based on pixel residual (" << r_pix << ") " << legend << " is " << (fail_pix ? "badly" : "well") << " estimated"
<< std::endl;
return fail_3d + fail_2d + fail_pix;
}
int main()
{
#if (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
try {
int test_planar_fail = 0, test_non_planar_fail = 0, fail = 0;
const double translation3DthreshWhenNoise = 0.005;
const double rotation3DthreshWhenNoise =
vpMath::rad(1.);
const double residual2DWhenNoise = 0.001;
const double residualPixelWhenNoise = 1.;
{
std::cout << "Start test considering planar case with 4 points..." << std::endl;
std::cout << "===================================================" << std::endl;
int npt = 4;
std::vector<vpPoint> P(npt);
double Z = 0.05;
P[0].setWorldCoordinates(-L, -L, Z);
P[1].setWorldCoordinates(L, -L, Z);
P[2].setWorldCoordinates(L, L, Z);
P[3].setWorldCoordinates(-L, L, Z);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange");
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon");
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac");
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then Lowe");
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe");
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS");
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS");
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then by VVS");
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS");
test_planar_fail |= fail;
}
{
std::cout << "\nStart test considering non-planar case with 6 points..." << std::endl;
std::cout << "=======================================================" << std::endl;
int npt = 6;
std::vector<vpPoint> P(npt);
P[0].setWorldCoordinates(-L, -L, 0);
P[0].setWorldCoordinates(-L, -L, -0.02);
P[1].setWorldCoordinates(L, -L, 0);
P[2].setWorldCoordinates(L, L, 0);
P[3].setWorldCoordinates(-2 * L, 3 * L, 0);
P[4].setWorldCoordinates(-L, L, 0.01);
P[5].setWorldCoordinates(L, L / 2., 0.03);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then Lowe");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS");
test_non_planar_fail |= fail;
}
std::cout << "\nStart test considering non-planar case with 4 points..." << std::endl;
std::cout << "=======================================================" << std::endl;
{
int npt = 4;
std::vector<vpPoint> P(npt);
P[0].setWorldCoordinates(-L2, -L2, 0);
P[1].setWorldCoordinates(L2, -L2, 0.2);
P[2].setWorldCoordinates(L2, L2, -0.1);
P[3].setWorldCoordinates(-L2, L2, 0);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe");
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS");
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
}
std::cout << "Start test considering planar case with 4 points and noise on the projection..." << std::endl;
std::cout << "===================================================" << std::endl;
{
int npt = 4;
std::vector<vpPoint> P(npt);
double Z = 0.05;
P[0].setWorldCoordinates(-L, -L, Z);
P[1].setWorldCoordinates(L, -L, Z);
P[2].setWorldCoordinates(L, L, Z);
P[3].setWorldCoordinates(-L, L, Z);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
double x_theo = P[i].get_X() / P[i].get_Z();
double y_theo = P[i].get_Y() / P[i].get_Z();
double u_theo = 0., v_theo = 0.;
double u_noisy = u_theo + random();
double v_noisy = v_theo + random();
double x_noisy = 0., y_noisy = 0.;
P[i].set_x(x_noisy);
P[i].set_y(y_noisy);
std::cout << "P[" << i << "]:\n\tu_theo = " << u_theo << "\tu_noisy = " << u_noisy << std::endl;
std::cout << "\tv_theo = " << v_theo << "\tv_noisy = " << v_noisy << std::endl;
std::cout << "\tx_theo = " << x_theo << "\ty_noisy = " << x_noisy << std::endl;
std::cout << "\ty_theo = " << y_theo << "\tx_noisy = " << y_noisy << std::endl;
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then Lowe"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_planar_fail |= fail;
}
std::cout << "\nStart test considering non-planar case with 6 points and noise on the projection..." << std::endl;
std::cout << "=======================================================" << std::endl;
{
int npt = 6;
std::vector<vpPoint> P(npt);
P[0].setWorldCoordinates(-L, -L, 0);
P[0].setWorldCoordinates(-L, -L, -0.02);
P[1].setWorldCoordinates(L, -L, 0);
P[2].setWorldCoordinates(L, L, 0);
P[3].setWorldCoordinates(-2 * L, 3 * L, 0);
P[4].setWorldCoordinates(-L, L, 0.01);
P[5].setWorldCoordinates(L, L / 2., 0.03);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
double x_theo = P[i].get_X() / P[i].get_Z();
double y_theo = P[i].get_Y() / P[i].get_Z();
double u_theo = 0., v_theo = 0.;
double u_noisy = u_theo + random();
double v_noisy = v_theo + random();
double x_noisy = 0., y_noisy = 0.;
P[i].set_x(x_noisy);
P[i].set_y(y_noisy);
std::cout << "P[" << i << "]:\n\tu_theo = " << u_theo << "\tu_noisy = " << u_noisy << std::endl;
std::cout << "\tv_theo = " << v_theo << "\tv_noisy = " << v_noisy << std::endl;
std::cout << "\tx_theo = " << x_theo << "\ty_noisy = " << x_noisy << std::endl;
std::cout << "\ty_theo = " << y_theo << "\tx_noisy = " << y_noisy << std::endl;
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then Lowe"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Lagrange then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
}
std::cout << "\nStart test considering non-planar case with 4 points and noise on the projection..." << std::endl;
std::cout << "=======================================================" << std::endl;
{
int npt = 4;
std::vector<vpPoint> P(npt);
P[0].setWorldCoordinates(-L2, -L2, 0.2);
P[1].setWorldCoordinates(L2, -L2, 0.4);
P[2].setWorldCoordinates(L2, L2, 0.1);
P[3].setWorldCoordinates(-L2, L2, 0.4);
for (int i = 0; i < npt; i++) {
P[i].project(cMo_ref);
double x_theo = P[i].get_X() / P[i].get_Z();
double y_theo = P[i].get_Y() / P[i].get_Z();
double u_theo = 0., v_theo = 0.;
double u_noisy = u_theo + random();
double v_noisy = v_theo + random();
double x_noisy = 0., y_noisy = 0.;
P[i].set_x(x_noisy);
P[i].set_y(y_noisy);
std::cout << "P[" << i << "]:\n\tu_theo = " << u_theo << "\tu_noisy = " << u_noisy << std::endl;
std::cout << "\tv_theo = " << v_theo << "\tv_noisy = " << v_noisy << std::endl;
std::cout << "\tx_theo = " << x_theo << "\ty_noisy = " << x_noisy << std::endl;
std::cout << "\ty_theo = " << y_theo << "\tx_noisy = " << y_noisy << std::endl;
}
print_pose(cMo_ref, std::string("Reference pose"));
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Ransac"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Ransac"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then Lowe"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then Lowe"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "--------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated by Dementhon then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose by Dementhon then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
print_pose(cMo, std::string("Pose estimated either by Dementhon or Lagrange then by VVS"));
fail = compare_pose(pose, cMo_ref, cMo, cam, "pose either by Dementhon or Lagrange then by VVS"
, translation3DthreshWhenNoise, rotation3DthreshWhenNoise, residual2DWhenNoise, residualPixelWhenNoise);
test_non_planar_fail |= fail;
std::cout << "-------------------------------------------------" << std::endl;
}
std::cout << "=======================================================" << std::endl;
std::cout << "Pose estimation test from planar points: " << (test_planar_fail ? "fail" : "is ok") << std::endl;
std::cout << "Pose estimation test from non-planar points: " << (test_non_planar_fail ? "fail" : "is ok")
<< std::endl;
std::cout << "Global pose estimation test: " << ((test_planar_fail | test_non_planar_fail) ? "fail" : "is ok")
<< std::endl;
return ((test_planar_fail | test_non_planar_fail) ? EXIT_FAILURE : EXIT_SUCCESS);
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
#else
std::cout << "Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
return EXIT_SUCCESS;
#endif
}
Generic class defining intrinsic camera parameters.
error that can be emitted by ViSP classes.
Class for generating random number with normal probability density.
Implementation of an homogeneous matrix and operations on such kind of matrices.
static double rad(double deg)
static double deg(double rad)
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Implementation of a pose vector and operations on poses.
Class used for pose computation from N points (pose from point only). Some of the algorithms implemen...
void addPoint(const vpPoint &P)
void setRansacNbInliersToReachConsensus(const unsigned int &nbC)
@ DEMENTHON_LAGRANGE_VIRTUAL_VS
std::list< vpPoint > listP
Array of point (use here class vpPoint)
double computeResidual(const vpHomogeneousMatrix &cMo) const
Compute and return the sum of squared residuals expressed in meter^2 for the pose matrix cMo.
bool computePose(vpPoseMethodType method, vpHomogeneousMatrix &cMo, bool(*func)(const vpHomogeneousMatrix &)=NULL)
void setRansacThreshold(const double &t)