52 #include <visp3/core/vpDebug.h>
53 #include <visp3/core/vpMath.h>
54 #include <visp3/core/vpRotationMatrix.h>
55 #include <visp3/core/vpThetaUVector.h>
56 #include <visp3/vision/vpHomography.h>
58 #include <visp3/core/vpDebug.h>
59 #include <visp3/core/vpHomogeneousMatrix.h>
60 #include <visp3/core/vpMath.h>
61 #include <visp3/core/vpPoint.h>
64 #include <visp3/core/vpRansac.h>
65 #include <visp3/io/vpParseArgv.h>
67 #define GETOPTARGS "h"
69 void usage(
const char *name,
const char *badparam);
70 bool getOptions(
int argc,
const char **argv);
80 void usage(
const char *name,
const char *badparam)
83 Test the Ransac homography estimation algorithm.\n\
95 fprintf(stderr,
"ERROR: \n");
96 fprintf(stderr,
"\nBad parameter [%s]\n", badparam);
109 bool getOptions(
int argc,
const char **argv)
117 usage(argv[0],
nullptr);
122 usage(argv[0], optarg_);
128 if ((c == 1) || (c == -1)) {
130 usage(argv[0],
nullptr);
131 std::cerr <<
"ERROR: " << std::endl;
132 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
139 int main(
int argc,
const char **argv)
141 #if (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
144 if (getOptions(argc, argv) ==
false) {
149 unsigned int nbpt = 11;
151 std::vector<vpPoint> P(nbpt);
152 std::vector<double> xa(nbpt), ya(nbpt), xb(nbpt), yb(nbpt);
154 P[0].setWorldCoordinates(-L, -L, 0);
155 P[1].setWorldCoordinates(2 * L, -L, 0);
156 P[2].setWorldCoordinates(L, L, 0);
157 P[3].setWorldCoordinates(-L, 3 * L, 0);
158 P[4].setWorldCoordinates(0, 0, L);
159 P[5].setWorldCoordinates(L, -2 * L, L);
160 P[6].setWorldCoordinates(L, -4 * L, 2 * L);
161 P[7].setWorldCoordinates(-2 * L, -L, -3 * L);
162 P[8].setWorldCoordinates(-5 * L, -5 * L, 0);
163 P[9].setWorldCoordinates(-2 * L, +3 * L, 4 * L);
164 P[10].setWorldCoordinates(-2 * L, -0.5 * L, 0);
166 std::vector<bool> inliers_ground_truth(nbpt,
false);
167 inliers_ground_truth[0] =
true;
168 inliers_ground_truth[1] =
true;
169 inliers_ground_truth[2] =
true;
170 inliers_ground_truth[3] =
true;
171 inliers_ground_truth[8] =
true;
172 inliers_ground_truth[10] =
true;
177 for (
unsigned int i = 0; i < nbpt; i++) {
179 xa[i] = P[i].get_x();
180 ya[i] = P[i].get_y();
183 for (
unsigned int i = 0; i < nbpt; i++) {
185 xb[i] = P[i].get_x();
186 yb[i] = P[i].get_y();
188 std::cout <<
"-------------------------------" << std::endl;
193 std::cout <<
"Compare with built homography H = R + t/d n " << std::endl;
196 std::cout <<
"aHb built from the displacement: \n" << aHb_built / aHb_built[2][2] << std::endl;
198 aHb_built.computeDisplacement(aRb, aTb, n);
199 std::cout <<
"Rotation aRb: " << std::endl;
200 std::cout << aRb << std::endl;
201 std::cout <<
"Translation: aTb" << std::endl;
202 std::cout << (aTb).t() << std::endl;
203 std::cout <<
"Normal to the plane: n" << std::endl;
204 std::cout << (n).t() << std::endl;
206 std::cout <<
"-------------------------------" << std::endl;
208 std::vector<bool> inliers;
214 std::cout <<
"aHb estimated using ransac:\n" << aHb << std::endl;
215 std::cout <<
"Inliers indexes (should be 0,1,2,3,8,10): ";
216 for (
unsigned int i = 0; i < inliers.size(); i++)
218 std::cout << i <<
",";
219 std::cout << std::endl;
221 if (inliers == inliers_ground_truth) {
222 std::cout <<
"Ransac estimation succeed" << std::endl;
226 std::cout <<
"Ransac estimation fails" << std::endl;
231 std::cout <<
"Catch an exception: " << e << std::endl;
237 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
Implementation of column vector and the associated operations.
error that can be emitted by ViSP classes.
Implementation of an homogeneous matrix and operations on such kind of matrices.
Implementation of an homography and operations on homographies.
static bool ransac(const std::vector< double > &xb, const std::vector< double > &yb, const std::vector< double > &xa, const std::vector< double > &ya, vpHomography &aHb, std::vector< bool > &inliers, double &residual, unsigned int nbInliersConsensus, double threshold, bool normalization=true)
static double rad(double deg)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
This class defines the container for a plane geometrical structure.
Implementation of a rotation matrix and operations on such kind of matrices.
Class that consider the case of a translation vector.