34 #include <visp3/core/vpColVector.h>
35 #include <visp3/core/vpMath.h>
36 #include <visp3/core/vpCameraParameters.h>
37 #include <visp3/core/vpPixelMeterConversion.h>
38 #include <visp3/core/vpMeterPixelConversion.h>
40 #include <visp3/rbt/vpRBSilhouettePointsExtractionSettings.h>
41 #include <visp3/rbt/vpRBSilhouettePoint.h>
47 m_depthThreshold = 0.1;
48 m_thresholdIsRelative =
false;
49 m_preferPreviousPoints =
false;
62 m_depthThreshold = rend.m_depthThreshold;
63 m_thresholdIsRelative = rend.m_thresholdIsRelative;
64 m_sampleStep = rend.m_sampleStep;
65 m_maxNumPoints = rend.m_maxNumPoints;
66 m_preferPreviousPoints = rend.m_preferPreviousPoints;
67 m_border = rend.m_border;
74 const std::vector<vpRBSilhouettePoint> &previousPoints,
long randomSeed)
const
76 const unsigned int rows = validSilhouette.
getHeight();
77 const unsigned int cols = validSilhouette.
getWidth();
79 std::vector<std::pair<unsigned int, unsigned int>> finalCandidates;
80 std::vector<std::pair<unsigned int, unsigned int>> candidates;
82 finalCandidates.reserve(m_maxNumPoints);
83 candidates.reserve(m_maxNumPoints);
85 if (m_preferPreviousPoints) {
87 double x = 0.0, y = 0.0;
94 unsigned nu =
static_cast<unsigned int>(round(x)), nv =
static_cast<unsigned int>(round(y));
95 if (nu > 0 && nv > 0 && nv < rows && nu < cols) {
96 if (validSilhouette[nv][nu] > 0 && fabs((renderDepth[nv][nu] / p.Z) - 1.0) < 0.01) {
97 finalCandidates.push_back(std::make_pair(nv, nu));
102 if (m_maxNumPoints > 0 && finalCandidates.size() >=
static_cast<unsigned int>(m_maxNumPoints)) {
103 return finalCandidates;
106 for (
unsigned int n = m_border; n < rows - m_border; n += m_sampleStep) {
107 for (
unsigned int m = m_border; m < cols - m_border; m += m_sampleStep) {
108 if (validSilhouette[n][m] > 0) {
109 candidates.push_back(std::make_pair(n, m));
114 if (m_maxNumPoints > 0) {
116 std::vector<size_t> indices(m_maxNumPoints - finalCandidates.size());
117 sampleWithoutReplacement(m_maxNumPoints - finalCandidates.size(), candidates.size(), indices, random);
118 for (
unsigned int i = 0; i < indices.size(); ++i) {
119 finalCandidates.push_back(candidates[indices[i]]);
123 for (
unsigned int i = 0; i < candidates.size(); ++i) {
124 finalCandidates.push_back(candidates[i]);
127 return finalCandidates;
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
Implementation of an homogeneous matrix and operations on such kind of matrices.
unsigned int getWidth() const
unsigned int getHeight() const
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)
Silhouette point simple candidate representation.
Class for generating random numbers with uniform probability density.