55 #include <visp3/core/vpDebug.h>
56 #include <visp3/core/vpMath.h>
57 #include <visp3/core/vpRotationMatrix.h>
58 #include <visp3/core/vpThetaUVector.h>
59 #include <visp3/vision/vpHomography.h>
61 #include <visp3/core/vpDebug.h>
62 #include <visp3/core/vpHomogeneousMatrix.h>
63 #include <visp3/core/vpMath.h>
64 #include <visp3/core/vpPoint.h>
67 #include <visp3/core/vpRansac.h>
68 #include <visp3/io/vpParseArgv.h>
70 #define GETOPTARGS "h"
72 void usage(
const char *name,
const char *badparam);
73 bool getOptions(
int argc,
const char **argv);
83 void usage(
const char *name,
const char *badparam)
86 Test the Ransac homography estimation algorithm.\n\
97 fprintf(stderr,
"ERROR: \n");
98 fprintf(stderr,
"\nBad parameter [%s]\n", badparam);
111 bool getOptions(
int argc,
const char **argv)
119 usage(argv[0], NULL);
124 usage(argv[0], optarg_);
130 if ((c == 1) || (c == -1)) {
132 usage(argv[0], NULL);
133 std::cerr <<
"ERROR: " << std::endl;
134 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
141 int main(
int argc,
const char **argv)
143 #if (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
146 if (getOptions(argc, argv) ==
false) {
151 unsigned int nbpt = 11;
153 std::vector<vpPoint> P(nbpt);
154 std::vector<double> xa(nbpt), ya(nbpt), xb(nbpt), yb(nbpt);
156 P[0].setWorldCoordinates(-L, -L, 0);
157 P[1].setWorldCoordinates(2 * L, -L, 0);
158 P[2].setWorldCoordinates(L, L, 0);
159 P[3].setWorldCoordinates(-L, 3 * L, 0);
160 P[4].setWorldCoordinates(0, 0, L);
161 P[5].setWorldCoordinates(L, -2 * L, L);
162 P[6].setWorldCoordinates(L, -4 * L, 2 * L);
163 P[7].setWorldCoordinates(-2 * L, -L, -3 * L);
164 P[8].setWorldCoordinates(-5 * L, -5 * L, 0);
165 P[9].setWorldCoordinates(-2 * L, +3 * L, 4 * L);
166 P[10].setWorldCoordinates(-2 * L, -0.5 * L, 0);
168 std::vector<bool> inliers_ground_truth(nbpt,
false);
169 inliers_ground_truth[0] =
true;
170 inliers_ground_truth[1] =
true;
171 inliers_ground_truth[2] =
true;
172 inliers_ground_truth[3] =
true;
173 inliers_ground_truth[8] =
true;
174 inliers_ground_truth[10] =
true;
179 for (
unsigned int i = 0; i < nbpt; i++) {
181 xa[i] = P[i].get_x();
182 ya[i] = P[i].get_y();
185 for (
unsigned int i = 0; i < nbpt; i++) {
187 xb[i] = P[i].get_x();
188 yb[i] = P[i].get_y();
190 std::cout <<
"-------------------------------" << std::endl;
195 std::cout <<
"Compare with built homography H = R + t/d n " << std::endl;
198 std::cout <<
"aHb built from the displacement: \n" << aHb_built / aHb_built[2][2] << std::endl;
200 aHb_built.computeDisplacement(aRb, aTb, n);
201 std::cout <<
"Rotation aRb: " << std::endl;
202 std::cout << aRb << std::endl;
203 std::cout <<
"Translation: aTb" << std::endl;
204 std::cout << (aTb).t() << std::endl;
205 std::cout <<
"Normal to the plane: n" << std::endl;
206 std::cout << (n).t() << std::endl;
208 std::cout <<
"-------------------------------" << std::endl;
210 std::vector<bool> inliers;
216 std::cout <<
"aHb estimated using ransac:\n" << aHb << std::endl;
217 std::cout <<
"Inliers indexes (should be 0,1,2,3,8,10): ";
218 for (
unsigned int i = 0; i < inliers.size(); i++)
220 std::cout << i <<
",";
221 std::cout << std::endl;
223 if (inliers == inliers_ground_truth) {
224 std::cout <<
"Ransac estimation succeed" << std::endl;
227 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 emited 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.