Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
Loading...
Searching...
No Matches
testPoseRansac.cpp
1
/*
2
* ViSP, open source Visual Servoing Platform software.
3
* Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4
*
5
* This software is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
9
* See the file LICENSE.txt at the root directory of this source
10
* distribution for additional information about the GNU GPL.
11
*
12
* For using ViSP with software that can not be combined with the GNU
13
* GPL, please contact Inria about acquiring a ViSP Professional
14
* Edition License.
15
*
16
* See https://visp.inria.fr for more information.
17
*
18
* This software was developed at:
19
* Inria Rennes - Bretagne Atlantique
20
* Campus Universitaire de Beaulieu
21
* 35042 Rennes Cedex
22
* France
23
*
24
* If you have questions regarding the use of this file, please contact
25
* Inria at visp@inria.fr
26
*
27
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29
*
30
* Description:
31
* Compute the pose of a 3D object using the Dementhon method. Assuming that
32
* the correspondence between 2D points and 3D points is not done, we use
33
* the RANSAC algorithm to achieve this task
34
*/
35
36
#include <visp3/core/vpHomogeneousMatrix.h>
37
#include <visp3/core/vpMath.h>
38
#include <visp3/core/vpPoint.h>
39
#include <visp3/vision/vpPose.h>
40
41
#include <stdio.h>
42
#include <stdlib.h>
43
44
#define L 0.1
45
52
53
int
main()
54
{
55
#ifdef ENABLE_VISP_NAMESPACE
56
using namespace
VISP_NAMESPACE_NAME
;
57
#endif
58
#if (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
59
try
{
60
std::cout <<
"Pose computation with matched points"
<< std::endl;
61
std::vector<vpPoint> P;
// Point to be tracked
62
63
P.push_back(
vpPoint
(-L, -L, 0));
64
P.push_back(
vpPoint
(L, -L, 0));
65
P.push_back(
vpPoint
(L, L, 0));
66
P.push_back(
vpPoint
(-L, L, 0));
67
68
double
L2 = L * 3.0;
69
P.push_back(
vpPoint
(0, -L2, 0));
70
P.push_back(
vpPoint
(L2, 0, 0));
71
P.push_back(
vpPoint
(0, L2, 0));
72
P.push_back(
vpPoint
(-L2, 0, 0));
73
74
vpHomogeneousMatrix
cMo_ref(0, 0.2, 1, 0, 0, 0);
75
for
(
size_t
i = 0;
i
< P.size();
i
++) {
76
P[
i
].project(cMo_ref);
77
P[
i
].print();
78
std::cout << std::endl;
79
}
80
81
// Introduce an error
82
double
error
= 0.01;
83
P[3].set_y(P[3].get_y() + 2 * error);
84
P[6].set_x(P[6].get_x() + error);
85
86
vpPose
pose;
87
for
(
size_t
i = 0;
i
< P.size();
i
++)
88
pose.
addPoint
(P[i]);
89
90
unsigned
int
nbInlierToReachConsensus =
static_cast<
unsigned
int
>
(75.0 *
static_cast<
double
>
(P.size()) / 100.0);
91
double
threshold = 0.001;
92
93
pose.
setRansacNbInliersToReachConsensus
(nbInlierToReachConsensus);
94
pose.
setRansacThreshold
(threshold);
95
96
vpHomogeneousMatrix
cMo
;
97
// vpPose::ransac(lp,lP, 5, 1e-6, ninliers, lPi, cMo) ;
98
pose.
computePose
(
vpPose::RANSAC
, cMo);
99
100
std::vector<vpPoint> inliers = pose.
getRansacInliers
();
101
102
std::cout <<
"Inliers: "
<< std::endl;
103
for
(
unsigned
int
i = 0;
i
< inliers.size();
i
++) {
104
inliers[
i
].print();
105
std::cout << std::endl;
106
}
107
108
vpPoseVector
pose_ref =
vpPoseVector
(cMo_ref);
109
vpPoseVector
pose_est =
vpPoseVector
(cMo);
110
111
std::cout << std::endl;
112
std::cout <<
"reference cMo :\n"
<< pose_ref.
t
() << std::endl << std::endl;
113
std::cout <<
"estimated cMo :\n"
<< pose_est.
t
() << std::endl << std::endl;
114
115
int
test_fail = 0;
116
for
(
unsigned
int
i = 0;
i
< 6;
i
++) {
117
if
(std::fabs(pose_ref[i] - pose_est[i]) > 0.001)
118
test_fail = 1;
119
}
120
121
std::cout <<
"Pose is "
<< (test_fail ?
"badly"
:
"well"
) <<
" estimated"
<< std::endl;
122
return
(test_fail ? EXIT_FAILURE : EXIT_SUCCESS);
123
}
124
catch
(
const
vpException
&e) {
125
std::cout <<
"Catch an exception: "
<<
e
<< std::endl;
126
return
EXIT_FAILURE;
127
}
128
#else
129
std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV"
<< std::endl;
130
return
EXIT_SUCCESS;
131
#endif
132
}
vpException
error that can be emitted by ViSP classes.
Definition
vpException.h:60
vpHomogeneousMatrix
Implementation of an homogeneous matrix and operations on such kind of matrices.
Definition
vpHomogeneousMatrix.h:221
vpPoint
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
Definition
vpPoint.h:79
vpPoseVector
Implementation of a pose vector and operations on poses.
Definition
vpPoseVector.h:203
vpPoseVector::t
vpRowVector t() const
Definition
vpPoseVector.cpp:439
vpPose
Class used for pose computation from N points (pose from point only). Some of the algorithms implemen...
Definition
vpPose.h:82
vpPose::addPoint
void addPoint(const vpPoint &P)
Definition
vpPose.cpp:96
vpPose::setRansacNbInliersToReachConsensus
void setRansacNbInliersToReachConsensus(const unsigned int &nbC)
Definition
vpPose.h:397
vpPose::RANSAC
@ RANSAC
Definition
vpPose.h:92
vpPose::computePose
bool computePose(vpPoseMethodType method, vpHomogeneousMatrix &cMo, FuncCheckValidityPose func=nullptr)
Definition
vpPose.cpp:385
vpPose::getRansacInliers
std::vector< vpPoint > getRansacInliers() const
Definition
vpPose.h:431
vpPose::setRansacThreshold
void setRansacThreshold(const double &t)
Definition
vpPose.h:402
VISP_NAMESPACE_NAME
Definition
vpEigenConversion.h:44
ibvs-four-points.e
e
Definition
ibvs-four-points.py:272
realsense-mbt.cMo
cMo
Definition
realsense-mbt.py:212
yolo-centering-task-afma6.error
ColVector error
Definition
yolo-centering-task-afma6.py:322
yolo-centering-task-afma6.i
i
Definition
yolo-centering-task-afma6.py:329
modules
vision
test
pose
testPoseRansac.cpp
Generated by
1.17.0