39#include <visp3/core/vpDebug.h>
40#include <visp3/core/vpException.h>
41#include <visp3/core/vpExponentialMap.h>
42#include <visp3/core/vpMath.h>
43#include <visp3/core/vpMatrixException.h>
44#include <visp3/core/vpPixelMeterConversion.h>
45#include <visp3/core/vpPolygon3D.h>
46#include <visp3/core/vpTrackingException.h>
47#include <visp3/core/vpVelocityTwistMatrix.h>
48#include <visp3/mbt/vpMbEdgeTracker.h>
49#include <visp3/mbt/vpMbtDistanceLine.h>
50#include <visp3/mbt/vpMbtXmlGenericParser.h>
51#include <visp3/vision/vpPose.h>
73 faces.getOgreContext()->setWindowName(
"MBT Edge");
86 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
88 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
96 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
105 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
131 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
133 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
138 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
144 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
163 double residu_1 = 1e3;
166 unsigned int iter = 0;
179 while (reloop ==
true && iter < 10) {
184 count = count /
static_cast<double>(nbrow);
216 while (std::fabs((residu_1 - r) * 1e8) > std::numeric_limits<double>::epsilon() && (iter <
m_maxIter)) {
219 bool reStartFromLastIncrement =
false;
223 if (!reStartFromLastIncrement) {
231 if (!isoJoIdentity) {
237 double wi = 0.0, eri = 0.0;
238 double num = 0.0, den = 0.0;
240 for (
unsigned int i = 0; i < nbrow; i++) {
249 for (
unsigned int j = 0; j < 6; j++) {
255 for (
unsigned int i = 0; i < nbrow; i++) {
293 limite = limite /
m_cam.get_px();
298 double e_prev = 0, e_cur, e_next;
300 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[lvl].begin(); it !=
lines[lvl].end(); ++it) {
301 if ((*it)->isTracked()) {
309 int index = *itindex;
321 std::list<vpMeSite>::const_iterator itListLine;
323 unsigned int indexFeature = 0;
325 for (
size_t a = 0; a < l->
meline.size(); a++) {
326 if (iter == 0 && l->
meline[a] !=
nullptr)
327 itListLine = l->
meline[a]->getMeList().begin();
329 for (
unsigned int i = 0; i < l->
nbFeature[a]; i++) {
330 for (
unsigned int j = 0; j < 6; j++) {
331 m_L_edge[n + i][j] = l->
L[indexFeature][j];
349 if (indexFeature == 0) {
352 e_next = l->
error[1];
364 e_cur = l->
error[indexFeature];
371 e_cur = l->
error[indexFeature];
372 e_next = l->
error[indexFeature + 1];
373 if (fabs(e_cur - e_prev) < limite) {
376 if (fabs(e_cur - e_next) < limite) {
388 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[lvl].begin(); it !=
cylinders[lvl].end();
390 if ((*it)->isTracked()) {
395 std::list<vpMeSite>::const_iterator itCyl1;
396 std::list<vpMeSite>::const_iterator itCyl2;
397 if (iter == 0 && (cy->
meline1 !=
nullptr || cy->
meline2 !=
nullptr)) {
398 itCyl1 = cy->
meline1->getMeList().begin();
399 itCyl2 = cy->
meline2->getMeList().begin();
402 for (
unsigned int i = 0; i < cy->
nbFeature; i++) {
403 for (
unsigned int j = 0; j < 6; j++) {
416 if (i < cy->nbFeaturel1) {
430 e_cur = cy->
error[0];
432 e_next = cy->
error[1];
442 e_cur = cy->
error[i];
444 e_next = cy->
error[i + 1];
456 e_cur = cy->
error[i];
463 e_cur = cy->
error[i];
470 e_cur = cy->
error[i];
471 e_next = cy->
error[i + 1];
472 if (fabs(e_cur - e_prev) < limite) {
475 if (fabs(e_cur - e_next) < limite) {
486 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[lvl].begin(); it !=
circles[lvl].end(); ++it) {
487 if ((*it)->isTracked()) {
492 std::list<vpMeSite>::const_iterator itCir;
493 if (iter == 0 && (ci->
meEllipse !=
nullptr)) {
494 itCir = ci->
meEllipse->getMeList().begin();
497 for (
unsigned int i = 0; i < ci->
nbFeature; i++) {
498 for (
unsigned int j = 0; j < 6; j++) {
518 e_cur = ci->
error[0];
520 e_next = ci->
error[1];
532 e_cur = ci->
error[i];
539 e_cur = ci->
error[i];
540 e_next = ci->
error[i + 1];
541 if (fabs(e_cur - e_prev) < limite) {
544 if (fabs(e_cur - e_next) < limite) {
563 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[lvl].begin(); it !=
lines[lvl].end(); ++it) {
564 if ((*it)->isTracked()) {
571 int index = *itindex;
582 for (
size_t a = 0; a < l->
meline.size(); a++) {
583 std::list<vpMeSite>::const_iterator itListLine;
584 if (l->
meline[a] !=
nullptr) {
585 itListLine = l->
meline[a]->getMeList().begin();
587 for (
unsigned int i = 0; i < l->
nbFeature[a]; i++) {
600 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[lvl].begin(); it !=
cylinders[lvl].end();
602 if ((*it)->isTracked()) {
606 std::list<vpMeSite>::const_iterator itCyl1;
607 std::list<vpMeSite>::const_iterator itCyl2;
609 itCyl1 = cy->
meline1->getMeList().begin();
610 itCyl2 = cy->
meline2->getMeList().begin();
613 for (
unsigned int i = 0; i < cy->
nbFeature; i++) {
616 if (i < cy->nbFeaturel1) {
632 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[lvl].begin(); it !=
circles[lvl].end(); ++it) {
633 if ((*it)->isTracked()) {
637 std::list<vpMeSite>::const_iterator itCir;
639 itCir = ci->
meEllipse->getMeList().begin();
642 for (
unsigned int i = 0; i < ci->
nbFeature; i++) {
661 for (
unsigned int i = 0; i < nerror; i++) {
667 for (
unsigned int j = 0; j < 6; j++) {
673 for (
unsigned int i = 0; i < nerror; i++) {
691 unsigned int rank = (
m_L_edge * cVo).kernel(K);
700 isoJoIdentity =
false;
719 v = -0.7 * LVJTLVJ.
pseudoInverse(LVJTLVJ.
getRows() * std::numeric_limits<double>::epsilon()) * LVJTR;
729 unsigned int nbrow = 0;
730 unsigned int nberrors_lines = 0;
731 unsigned int nberrors_cylinders = 0;
732 unsigned int nberrors_circles = 0;
734 nbrow =
initMbtTracking(nberrors_lines, nberrors_cylinders, nberrors_circles);
738 "No data found to compute the interaction matrix...");
741 m_L_edge.resize(nbrow, 6,
false,
false);
754 m_wLines.resize(nberrors_lines,
false);
769 "computeVVSInteractionMatrixAndR"
770 "esidu() should not be called!");
780 unsigned int nlines = 0;
781 unsigned int ncylinders = 0;
782 unsigned int ncircles = 0;
786 if ((*it)->isTracked()) {
790 for (
unsigned int j = 0; j < 6; j++) {
801 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
803 if ((*it)->isTracked()) {
806 for (
unsigned int i = 0; i < cy->
nbFeature; i++) {
807 for (
unsigned int j = 0; j < 6; j++) {
819 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
821 if ((*it)->isTracked()) {
824 for (
unsigned int i = 0; i < ci->
nbFeature; i++) {
825 for (
unsigned int j = 0; j < 6; j++) {
843 if (nberrors_lines > 0)
845 if (nberrors_cylinders > 0)
847 if (nberrors_circles > 0)
866 unsigned int nbFeatures = 0;
871 for (
size_t a = 0; a < l->
meline.size(); a++) {
872 if (l->
meline[a] !=
nullptr) {
873 double lineNormGradient;
874 unsigned int lineNbFeatures;
879 nbFeatures += lineNbFeatures;
885 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
890 double cylinderNormGradient = 0;
891 unsigned int cylinderNbFeatures = 0;
896 nbFeatures += cylinderNbFeatures;
900 double cylinderNormGradient = 0;
901 unsigned int cylinderNbFeatures = 0;
906 nbFeatures += cylinderNbFeatures;
911 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
915 double circleNormGradient = 0;
916 unsigned int circleNbFeatures = 0;
921 nbFeatures += circleNbFeatures;
925 if (nbFeatures > 0) {
943 int nbExpectedPoint = 0;
951 for (
size_t a = 0; a < l->
meline.size(); a++) {
952 if (l->
meline[a] !=
nullptr) {
953 nbExpectedPoint +=
static_cast<int>(l->
meline[a]->expecteddensity);
954 for (std::list<vpMeSite>::const_iterator itme = l->
meline[a]->getMeList().begin();
955 itme != l->
meline[a]->getMeList().end(); ++itme) {
967 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
971 nbExpectedPoint +=
static_cast<int>(cy->
meline1->expecteddensity);
972 for (std::list<vpMeSite>::const_iterator itme1 = cy->
meline1->getMeList().begin();
973 itme1 != cy->
meline1->getMeList().end(); ++itme1) {
980 nbExpectedPoint +=
static_cast<int>(cy->
meline2->expecteddensity);
981 for (std::list<vpMeSite>::const_iterator itme2 = cy->
meline2->getMeList().begin();
982 itme2 != cy->
meline2->getMeList().end(); ++itme2) {
992 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
996 nbExpectedPoint += ci->
meEllipse->getExpectedDensity();
997 for (std::list<vpMeSite>::const_iterator itme = ci->
meEllipse->getMeList().begin();
998 itme != ci->
meEllipse->getMeList().end(); ++itme) {
1011 if (nbGoodPoint < nb_min || nbExpectedPoint < 2) {
1012 std::ostringstream oss;
1013 oss <<
"Not enough moving edges (" << nbGoodPoint <<
") to track the object: expected " << nb_min
1015 <<
" using vpMbTracker::setGoodMovingEdgesRatioThreshold()";
1031 unsigned int lvl =
static_cast<unsigned int>(
scales.size());
1046 vpTRACE(
"Error in moving edge tracking");
1089 bool newvisibleface =
false;
1095 faces.computeScanLineRender(
m_cam, I.getWidth(), I.getHeight());
1145#ifdef VISP_HAVE_OGRE
1147 if (!
faces.isOgreInitialised()) {
1148 faces.setBackgroundSizeOgre(I.getHeight(), I.getWidth());
1160 m_cam.computeFov(I.getWidth(), I.getHeight());
1167 m_cam.computeFov(I.getWidth(), I.getHeight());
1170 faces.computeScanLineRender(
m_cam, I.getWidth(), I.getHeight());
1174 unsigned int i =
static_cast<unsigned int>(
scales.size());
1229#if defined(VISP_HAVE_PUGIXML)
1242 std::cout <<
" *********** Parsing XML for Mb Edge Tracker ************ " << std::endl;
1244 xmlp.
parse(configFile);
1300 bool displayFullModel)
1307 std::vector<std::vector<double> > models =
1310 for (
size_t i = 0; i < models.size(); i++) {
1318 double n20 = models[i][3];
1319 double n11 = models[i][4];
1320 double n02 = models[i][5];
1325#ifdef VISP_HAVE_OGRE
1327 faces.displayOgre(cMo);
1343 const vpColor &col,
unsigned int thickness,
bool displayFullModel)
1350 std::vector<std::vector<double> > models =
1353 for (
size_t i = 0; i < models.size(); i++) {
1361 double n20 = models[i][3];
1362 double n11 = models[i][4];
1363 double n02 = models[i][5];
1368#ifdef VISP_HAVE_OGRE
1370 faces.displayOgre(cMo);
1376 std::vector<std::vector<double> > features;
1378 const unsigned int lvl = 0;
1379 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[lvl].begin(); it !=
lines[lvl].end(); ++it) {
1383 features.insert(features.end(), currentFeatures.begin(), currentFeatures.end());
1387 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[lvl].begin(); it !=
cylinders[lvl].end();
1392 features.insert(features.end(), currentFeatures.begin(), currentFeatures.end());
1396 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[lvl].begin(); it !=
circles[lvl].end(); ++it) {
1400 features.insert(features.end(), currentFeatures.begin(), currentFeatures.end());
1425 bool displayFullModel)
1427 std::vector<std::vector<double> > models;
1429 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
1433 std::vector<std::vector<double> > currentModel =
1434 (*it)->getModelForDisplay(width, height, cMo, cam, displayFullModel);
1435 models.insert(models.end(), currentModel.begin(), currentModel.end());
1438 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1440 std::vector<std::vector<double> > currentModel =
1441 (*it)->getModelForDisplay(width, height, cMo, cam, displayFullModel);
1442 models.insert(models.end(), currentModel.begin(), currentModel.end());
1445 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1447 std::vector<double> paramsCircle = (*it)->getModelForDisplay(cMo, cam, displayFullModel);
1448 if (!paramsCircle.empty()) {
1449 models.push_back(paramsCircle);
1541 const bool doNotTrack =
false;
1544 initRange_ =
me.getInitRange();
1553 bool isvisible =
false;
1557 int index = *itindex;
1579 for (
size_t a = 0; a < l->
meline.size(); a++) {
1580 if (l->
meline[a] !=
nullptr)
1582 if (a < l->nbFeature.size())
1591 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1595 bool isvisible =
false;
1629 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1632 bool isvisible =
false;
1667 const bool doNotTrack =
false;
1680 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1691 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1713 if ((*it)->isTracked()) {
1723 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1725 if ((*it)->isTracked()) {
1735 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1737 if ((*it)->isTracked()) {
1754 if ((*it)->isTracked()) {
1756 unsigned int indexLine = 0;
1758 for (
size_t a = 0; a < l->
meline.size(); a++) {
1760 std::list<vpMeSite>::iterator itListLine;
1761 itListLine = l->
meline[a]->getMeList().begin();
1763 for (
unsigned int i = 0; i < l->
nbFeature[a]; i++) {
1766 if (
m_w_edge[n + indexLine] < 0.5) {
1793 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1795 if ((*it)->isTracked()) {
1798 std::list<vpMeSite>::iterator itListCyl1;
1799 std::list<vpMeSite>::iterator itListCyl2;
1802 itListCyl1 = cy->
meline1->getMeList().begin();
1803 itListCyl2 = cy->
meline2->getMeList().begin();
1805 for (
unsigned int i = 0; i < cy->
nbFeaturel1; i++) {
1830 for (
unsigned int i = cy->
nbFeaturel1; i < cy->nbFeature; i++) {
1859 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1861 if ((*it)->isTracked()) {
1864 std::list<vpMeSite>::iterator itListCir;
1867 itListCir = ci->
meEllipse->getMeList().begin();
1871 for (
unsigned int i = 0; i < ci->
nbFeature; i++) {
1913 if ((*it)->isTracked()) {
1921 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
1923 if ((*it)->isTracked()) {
1931 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
1933 if ((*it)->isTracked()) {
1946 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
1948 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
1949 for (
size_t a = 0; a < (*it)->meline.size(); a++) {
1950 if ((*it)->meline[a] !=
nullptr) {
1951 delete (*it)->meline[a];
1952 (*it)->meline[a] =
nullptr;
1956 (*it)->meline.clear();
1957 (*it)->nbFeature.clear();
1958 (*it)->nbFeatureTotal = 0;
1961 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
1963 if ((*it)->meline1 !=
nullptr) {
1964 delete (*it)->meline1;
1965 (*it)->meline1 =
nullptr;
1967 if ((*it)->meline2 !=
nullptr) {
1968 delete (*it)->meline2;
1969 (*it)->meline2 =
nullptr;
1972 (*it)->nbFeature = 0;
1973 (*it)->nbFeaturel1 = 0;
1974 (*it)->nbFeaturel2 = 0;
1977 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
1978 if ((*it)->meEllipse !=
nullptr) {
1979 delete (*it)->meEllipse;
1980 (*it)->meEllipse =
nullptr;
1982 (*it)->nbFeature = 0;
2004 bool already_here =
false;
2007 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2010 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2014 already_here =
true;
2020 if (!already_here) {
2043 lines[i].push_back(l);
2060 for (
unsigned int i = 0; i <
scales.size(); i++) {
2062 for (std::list<vpMbtDistanceLine *>::iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2064 if (name.compare(l->
getName()) == 0) {
2085 const std::string &name)
2088 bool already_here =
false;
2091 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2094 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
2103 if (!already_here) {
2146 bool already_here =
false;
2149 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2152 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
2162 if (!already_here) {
2190 for (
unsigned int i = 0; i <
scales.size(); i++) {
2192 for (std::list<vpMbtDistanceCylinder *>::iterator it =
cylinders[i].begin(); it !=
cylinders[i].end(); ++it) {
2194 if (name.compare(cy->
getName()) == 0) {
2212 for (
unsigned int i = 0; i <
scales.size(); i++) {
2214 for (std::list<vpMbtDistanceCircle *>::iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
2216 if (name.compare(ci->
getName()) == 0) {
2232 unsigned int nbpt = p.getNbPoint();
2234 for (
unsigned int i = 0; i < nbpt - 1; i++)
2235 addLine(p.p[i], p.p[i + 1], p.getIndex());
2236 addLine(p.p[nbpt - 1], p.p[0], p.getIndex());
2254 bool changed =
false;
2260#ifdef VISP_HAVE_OGRE
2269 newvisibleline =
true;
2272 newvisibleline =
false;
2296 for (
unsigned int i = 0; i < nbpt - 1; i++)
2320 for (
unsigned int i = 0; i < nbpt - 1; i++)
2326 unsigned int &nberrors_circles)
2328 unsigned int nbrow = 0;
2330 nberrors_cylinders = 0;
2331 nberrors_circles = 0;
2345 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
2356 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
2382 const std::string &name)
2384 addCircle(p1, p2, p3, radius,
static_cast<int>(idFace), name);
2398 const std::string &name)
2400 addCylinder(p1, p2, radius,
static_cast<int>(idFace), name);
2415 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2417 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2424 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
2432 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
2448#ifdef VISP_HAVE_OGRE
2489 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2491 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2498 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
2506 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
2549 unsigned int nbGoodPoints = 0;
2551 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[level].begin(); it !=
lines[level].end(); ++it) {
2554 for (
size_t a = 0; a < l->
meline.size(); a++) {
2556 for (std::list<vpMeSite>::const_iterator itme = l->
meline[a]->getMeList().begin();
2557 itme != l->
meline[a]->getMeList().end(); ++itme) {
2566 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[level].begin(); it !=
cylinders[level].end();
2570 for (std::list<vpMeSite>::const_iterator itme1 = cy->
meline1->getMeList().begin();
2571 itme1 != cy->
meline1->getMeList().end(); ++itme1) {
2575 for (std::list<vpMeSite>::const_iterator itme2 = cy->
meline2->getMeList().begin();
2576 itme2 != cy->
meline2->getMeList().end(); ++itme2) {
2584 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[level].begin(); it !=
circles[level].end(); ++it) {
2587 for (std::list<vpMeSite>::const_iterator itme = ci->
meEllipse->getMeList().begin();
2588 itme != ci->
meEllipse->getMeList().end(); ++itme) {
2595 return nbGoodPoints;
2621 unsigned int nbActivatedLevels = 0;
2622 for (
unsigned int i = 0; i < scale.size(); i++) {
2624 nbActivatedLevels++;
2628 if (scale.empty() || (nbActivatedLevels == 0)) {
2629 vpERROR_TRACE(
" !! WARNING : must use at least one level for the "
2630 "tracking. Use the global one");
2632 this->
scales.push_back(
true);
2646 lines.resize(scale.size());
2650 for (
unsigned int i = 0; i <
lines.size(); i++) {
2666 std::cerr <<
"Far clipping value cannot be inferior than near clipping "
2667 "value. Far clipping won't be considered."
2670 std::cerr <<
"Far clipping value cannot be inferior than 0. Far clipping "
2671 "won't be considered."
2677 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2679 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2696 std::cerr <<
"Near clipping value cannot be superior than far clipping "
2697 "value. Near clipping won't be considered."
2700 std::cerr <<
"Near clipping value cannot be inferior than 0. Near "
2701 "clipping won't be considered."
2707 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2709 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2731 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2733 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2759 _pyramid.resize(
scales.size());
2765 _pyramid[0] =
nullptr;
2768 for (
unsigned int i = 1; i < _pyramid.size(); i += 1) {
2770 unsigned int cScale =
static_cast<unsigned int>(pow(2.,
static_cast<int>(i)));
2772 for (
unsigned int k = 0, ii = 0; k < I->getHeight(); k += 1, ii += cScale) {
2773 for (
unsigned int l = 0, jj = 0; l < I->getWidth(); l += 1, jj += cScale) {
2774 (*I)[k][l] = I_[ii][jj];
2780 _pyramid[i] =
nullptr;
2793 if (_pyramid.size() > 0) {
2794 _pyramid[0] =
nullptr;
2795 for (
unsigned int i = 1; i < _pyramid.size(); i += 1) {
2796 if (_pyramid[i] !=
nullptr) {
2798 _pyramid[i] =
nullptr;
2818 std::ostringstream oss;
2820 std::string errorMsg =
"level " + oss.str() +
" is not used, cannot get its distance lines.";
2824 linesList =
lines[level];
2840 std::ostringstream oss;
2842 std::string errorMsg =
"level " + oss.str() +
" is not used, cannot get its distance lines.";
2862 std::ostringstream oss;
2864 std::string errorMsg =
"level " + oss.str() +
" is not used, cannot get its distance lines.";
2879 const double ratio = pow(2.,
static_cast<int>(_scale));
2889 m_cam.initFromCalibrationMatrix(K);
2900 const double ratio = pow(2.,
static_cast<int>(_scale));
2910 m_cam.initFromCalibrationMatrix(K);
2928 if ((*it)->isTracked()) {
2935 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[
scaleLevel].begin();
2937 if ((*it)->isTracked()) {
2944 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[
scaleLevel].begin();
2946 if ((*it)->isTracked()) {
2966 for (
unsigned int i = 0; i <
scales.size(); i += 1) {
2968 for (std::list<vpMbtDistanceLine *>::const_iterator it =
lines[i].begin(); it !=
lines[i].end(); ++it) {
2979 (*it)->setTracked(name, useEdgeTracking);
2982 for (std::list<vpMbtDistanceCylinder *>::const_iterator it =
cylinders[i].begin(); it !=
cylinders[i].end();
2984 if (
faces[
static_cast<unsigned int>((*it)->index_polygon)]->getName() == name) {
2985 (*it)->setTracked(useEdgeTracking);
2989 for (std::list<vpMbtDistanceCircle *>::const_iterator it =
circles[i].begin(); it !=
circles[i].end(); ++it) {
2990 if (
faces[
static_cast<unsigned int>((*it)->index_polygon)]->getName() == name) {
2991 (*it)->setTracked(useEdgeTracking);
unsigned int getRows() const
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
Class to define RGB colors available for display functionalities.
static const vpColor cyan
static const vpColor blue
static const vpColor purple
static const vpColor yellow
static const vpColor green
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void displayEllipse(const vpImage< unsigned char > &I, const vpImagePoint ¢er, const double &coef1, const double &coef2, const double &coef3, bool use_normalized_centered_moments, const vpColor &color, unsigned int thickness=1, bool display_center=false, bool display_arc=false)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
error that can be emitted by ViSP classes.
@ dimensionError
Bad dimension.
static vpHomogeneousMatrix direct(const vpColVector &v)
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpHomogeneousMatrix inverse() const
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition of the vpImage class member functions.
unsigned int getWidth() const
unsigned int getHeight() const
static double rad(double deg)
static Type maximum(const Type &a, const Type &b)
static double sqr(double x)
static bool equal(double x, double y, double threshold=0.001)
static Type minimum(const Type &a, const Type &b)
static int sign(double x)
static double deg(double rad)
Implementation of a matrix and operations on matrices.
vpMatrix pseudoInverse(double svThreshold=1e-6) const
void removeCircle(const std::string &name)
void computeVVS(const vpImage< unsigned char > &_I, unsigned int lvl)
vpColVector m_errorCircles
void updateMovingEdgeWeights()
vpColVector m_w_edge
Robust weights.
void upScale(const unsigned int _scale)
void addLine(vpPoint &p1, vpPoint &p2, int polygon=-1, std::string name="")
vpRobust m_robust_edge
Robust.
virtual void reInitModel(const vpImage< unsigned char > &I, const std::string &cad_name, const vpHomogeneousMatrix &cMo, bool verbose=false, const vpHomogeneousMatrix &T=vpHomogeneousMatrix())
std::vector< std::list< vpMbtDistanceLine * > > lines
vpMe me
The moving edges parameters.
virtual void computeVVSInteractionMatrixAndResidu() VP_OVERRIDE
void displayFeaturesOnImage(const vpImage< unsigned char > &I)
void getLcylinder(std::list< vpMbtDistanceCylinder * > &cylindersList, unsigned int level=0) const
virtual void init(const vpImage< unsigned char > &I) VP_OVERRIDE
void computeProjectionError(const vpImage< unsigned char > &_I)
virtual void testTracking() VP_OVERRIDE
virtual void setNearClippingDistance(const double &dist) VP_OVERRIDE
virtual void computeVVSWeights()
virtual void track(const vpImage< unsigned char > &I) VP_OVERRIDE
virtual void display(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const vpColor &col, unsigned int thickness=1, bool displayFullModel=false) VP_OVERRIDE
vpColVector m_error_edge
(s - s*)
void downScale(const unsigned int _scale)
void cleanPyramid(std::vector< const vpImage< unsigned char > * > &_pyramid)
void removeCylinder(const std::string &name)
std::vector< std::list< vpMbtDistanceCylinder * > > cylinders
Vector of the tracked cylinders.
void computeVVSFirstPhase(const vpImage< unsigned char > &I, unsigned int iter, double &count, unsigned int lvl=0)
void addCircle(const vpPoint &P1, const vpPoint &P2, const vpPoint &P3, double r, int idFace=-1, const std::string &name="")
void initPyramid(const vpImage< unsigned char > &_I, std::vector< const vpImage< unsigned char > * > &_pyramid)
std::vector< std::vector< double > > m_featuresToBeDisplayedEdge
Display features.
unsigned int nbvisiblepolygone
Number of polygon (face) currently visible.
void addCylinder(const vpPoint &P1, const vpPoint &P2, double r, int idFace=-1, const std::string &name="")
virtual void computeVVSInit() VP_OVERRIDE
std::vector< std::list< vpMbtDistanceCircle * > > circles
Vector of the tracked circles.
void getLcircle(std::list< vpMbtDistanceCircle * > &circlesList, unsigned int level=0) const
void removeLine(const std::string &name)
virtual std::vector< std::vector< double > > getFeaturesForDisplayEdge()
virtual void initFaceFromLines(vpMbtPolygon &polygon) VP_OVERRIDE
void setScales(const std::vector< bool > &_scales)
void trackMovingEdge(const vpImage< unsigned char > &I)
std::vector< const vpImage< unsigned char > * > Ipyramid
virtual void setFarClippingDistance(const double &dist) VP_OVERRIDE
virtual unsigned int getNbPoints(unsigned int level=0) const
vpColVector m_weightedError_edge
Weighted error.
virtual void initFaceFromCorners(vpMbtPolygon &polygon) VP_OVERRIDE
std::vector< bool > scales
Vector of scale level to use for the multi-scale tracking.
void computeVVSFirstPhaseFactor(const vpImage< unsigned char > &I, unsigned int lvl=0)
void updateMovingEdge(const vpImage< unsigned char > &I)
virtual ~vpMbEdgeTracker() VP_OVERRIDE
vpMatrix m_L_edge
Interaction matrix.
vpRobust m_robustCylinders
unsigned int initMbtTracking(unsigned int &nberrors_lines, unsigned int &nberrors_cylinders, unsigned int &nberrors_circles)
void reInitLevel(const unsigned int _lvl)
virtual void setClipping(const unsigned int &flags) VP_OVERRIDE
void reinitMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &_cMo)
virtual std::vector< std::vector< double > > getModelForDisplay(unsigned int width, unsigned int height, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, bool displayFullModel=false) VP_OVERRIDE
void computeVVSFirstPhasePoseEstimation(unsigned int iter, bool &isoJoIdentity)
void resetTracker() VP_OVERRIDE
virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, double radius, int idFace=0, const std::string &name="") VP_OVERRIDE
void setMovingEdge(const vpMe &me)
void setUseEdgeTracking(const std::string &name, const bool &useEdgeTracking)
virtual void setCameraParameters(const vpCameraParameters &cam) VP_OVERRIDE
void getLline(std::list< vpMbtDistanceLine * > &linesList, unsigned int level=0) const
virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, double radius, int idFace=0, const std::string &name="") VP_OVERRIDE
unsigned int nbFeaturesForProjErrorComputation
Number of features used in the computation of the projection error.
vpColVector m_factor
Edge VVS variables.
void visibleFace(const vpImage< unsigned char > &_I, const vpHomogeneousMatrix &_cMo, bool &newvisibleline)
void initMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &_cMo, const bool &useInitRange=true)
void addPolygon(vpMbtPolygon &p)
virtual void setPose(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cdMo) VP_OVERRIDE
vpColVector m_errorCylinders
virtual void loadConfigFile(const std::string &configFile, bool verbose=true) VP_OVERRIDE
bool isAppearing(unsigned int i)
bool isVisible(unsigned int i)
double m_lambda
Gain of the virtual visual servoing stage.
double minLineLengthThresholdGeneral
Minimum line length threshold for LOD mode (general setting).
bool m_projectionErrorDisplay
Display gradient and model orientation for projection error computation.
virtual void setMinLineLengthThresh(double minLineLengthThresh, const std::string &name="")
vpImage< unsigned char > m_I
Grayscale image buffer, used when passing color images.
unsigned int m_projectionErrorDisplayLength
Length of the arrows used to show the gradient and model orientation.
bool samePoint(const vpPoint &P1, const vpPoint &P2) const
bool useLodGeneral
True if LOD mode is enabled.
double minPolygonAreaThresholdGeneral
Minimum polygon area threshold for LOD mode (general setting).
bool m_computeInteraction
vpMatrix oJo
The Degrees of Freedom to estimate.
virtual void setMinPolygonAreaThresh(double minPolygonAreaThresh, const std::string &name="")
vpUniRand m_rand
Random number generator used in vpMbtDistanceLine::buildFrom().
vpMatrix covarianceMatrix
Covariance matrix.
double m_initialMu
Initial Mu for Levenberg Marquardt optimization loop.
vpHomogeneousMatrix m_cMo
The current pose.
vpMatrix m_SobelX
Sobel kernel in X.
virtual void computeVVSCheckLevenbergMarquardt(unsigned int iter, vpColVector &error, const vpColVector &m_error_prev, const vpHomogeneousMatrix &cMoPrev, double &mu, bool &reStartFromLastIncrement, vpColVector *const w=nullptr, const vpColVector *const m_w_prev=nullptr)
vpCameraParameters m_cam
The camera parameters.
bool useOgre
Use Ogre3d for global visibility tests.
vpMbHiddenFaces< vpMbtPolygon > faces
Set of faces describing the object.
virtual void setLod(bool useLod, const std::string &name="")
unsigned int m_projectionErrorDisplayThickness
Thickness of the arrows used to show the gradient and model orientation.
virtual void computeCovarianceMatrixVVS(const bool isoJoIdentity, const vpColVector &w_true, const vpHomogeneousMatrix &cMoPrev, const vpMatrix &L_true, const vpMatrix &LVJ_true, const vpColVector &error)
vpMbtOptimizationMethod m_optimizationMethod
Optimization method used.
virtual void computeVVSPoseEstimation(const bool isoJoIdentity, unsigned int iter, vpMatrix &L, vpMatrix <L, vpColVector &R, const vpColVector &error, vpColVector &error_prev, vpColVector <R, double &mu, vpColVector &v, const vpColVector *const w=nullptr, vpColVector *const m_w_prev=nullptr)
bool displayFeatures
If true, the features are displayed.
virtual void loadModel(const std::string &modelFile, bool verbose=false, const vpHomogeneousMatrix &od_M_o=vpHomogeneousMatrix())
double angleDisappears
Angle used to detect a face disappearance.
virtual unsigned int getNbPolygon() const
virtual void setNearClippingDistance(const double &dist)
bool applyLodSettingInConfig
virtual void setFarClippingDistance(const double &dist)
double distFarClip
Distance for near clipping.
bool m_isoJoIdentity
Boolean to know if oJo is identity (for fast computation).
bool useScanLine
Use Scanline for global visibility tests.
void computeJTR(const vpMatrix &J, const vpColVector &R, vpColVector &JTR) const
vpMatrix m_SobelY
Sobel kernel in Y.
virtual void setClipping(const unsigned int &flags)
double angleAppears
Angle used to detect a face appearance.
const vpImage< bool > * m_mask
Mask used to disable tracking on a part of image.
virtual void initFromPose(const vpImage< unsigned char > &I, const std::string &initFile)
bool computeCovariance
Flag used to specify if the covariance matrix has to be computed or not.
double distNearClip
Distance for near clipping.
unsigned int m_maxIter
Maximum number of iterations of the virtual visual servoing stage.
bool ogreShowConfigDialog
unsigned int clippingFlag
Flags specifying which clipping to used.
virtual void loadConfigFile(const std::string &configFile, bool verbose=true)
Manage a circle used in the model-based tracker.
void setVisible(bool _isvisible)
void setMovingEdge(vpMe *Me)
void updateMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo)
std::vector< std::vector< double > > getFeaturesForDisplay()
void setCameraParameters(const vpCameraParameters &camera)
vpColVector error
The error vector.
vpMbHiddenFaces< vpMbtPolygon > * hiddenface
Pointer to the list of faces.
vpPoint * p1
The center of the circle.
unsigned int nbFeature
The number of moving edges.
vpMatrix L
The interaction matrix.
void setIndex(unsigned int i)
std::string getName() const
void trackMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo)
void computeInteractionMatrixError(const vpHomogeneousMatrix &cMo)
void buildFrom(const vpPoint &_p1, const vpPoint &_p2, const vpPoint &_p3, double r)
vpPoint * p2
A point on the plane containing the circle.
void setMeanWeight(double _wmean)
bool Reinit
Indicates if the circle has to be reinitialized.
void reinitMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpImage< bool > *mask=nullptr)
bool initMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, bool doNotTrack, const vpImage< bool > *mask=nullptr, const int &initRange=1U)
double radius
The radius of the circle.
int index_polygon
Index of the faces which contain the line.
void initInteractionMatrixError()
vpPoint * p3
An other point on the plane containing the circle.
vpMbtMeEllipse * meEllipse
The moving edge containers.
void setName(const std::string &circle_name)
Manage a cylinder used in the model-based tracker.
void setMeanWeight1(double wmean)
void buildFrom(const vpPoint &_p1, const vpPoint &_p2, double r)
void setCameraParameters(const vpCameraParameters &camera)
void updateMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo)
void computeInteractionMatrixError(const vpHomogeneousMatrix &cMo, const vpImage< unsigned char > &I)
void reinitMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpImage< bool > *mask=nullptr)
void setName(const std::string &cyl_name)
vpMbtMeLine * meline2
The moving edge containers (second line of the cylinder).
bool initMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, bool doNotTrack, const vpImage< bool > *mask=nullptr, const int &initRange=0)
void setVisible(bool _isvisible)
vpMatrix L
The interaction matrix.
unsigned int nbFeaturel2
The number of moving edges on line 2.
bool Reinit
Indicates if the line has to be reinitialized.
vpPoint * p2
The second extremity on the axe.
void initInteractionMatrixError()
vpMbHiddenFaces< vpMbtPolygon > * hiddenface
Pointer to the list of faces.
void setMovingEdge(vpMe *Me)
void setMeanWeight2(double wmean)
double radius
The radius of the cylinder.
unsigned int nbFeaturel1
The number of moving edges on line 1.
vpColVector error
The error vector.
std::string getName() const
std::vector< std::vector< double > > getFeaturesForDisplay()
unsigned int nbFeature
The number of moving edges.
int index_polygon
Index of the face which contains the cylinder.
void setIndex(unsigned int i)
void trackMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo)
vpPoint * p1
The first extremity on the axe.
vpMbtMeLine * meline1
The moving edge containers (first line of the cylinder).
Manage the line of a polygon used in the model-based tracker.
void setMovingEdge(vpMe *Me)
std::vector< unsigned int > nbFeature
The number of moving edges.
void updateMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo)
bool initMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, bool doNotTrack, const vpImage< bool > *mask=nullptr, const int &initRange=0)
void setIndex(unsigned int i)
void computeInteractionMatrixError(const vpHomogeneousMatrix &cMo)
vpPoint * p2
The second extremity.
void initInteractionMatrixError()
std::list< int > Lindex_polygon
Index of the faces which contain the line.
void buildFrom(vpPoint &_p1, vpPoint &_p2, vpUniRand &rand_gen)
unsigned int nbFeatureTotal
The number of moving edges.
bool Reinit
Indicates if the line has to be reinitialized.
std::string getName() const
vpColVector error
The error vector.
vpMbHiddenFaces< vpMbtPolygon > * hiddenface
Pointer to the list of faces.
bool closeToImageBorder(const vpImage< unsigned char > &I, const unsigned int threshold)
vpMbtPolygon & getPolygon()
std::vector< std::vector< double > > getFeaturesForDisplay()
bool useScanLine
Use scanline rendering.
vpPoint * p1
The first extremity.
std::vector< vpMbtMeLine * > meline
The moving edge container.
vpMatrix L
The interaction matrix.
void setCameraParameters(const vpCameraParameters &camera)
void reinitMovingEdge(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpImage< bool > *mask=nullptr)
void setName(const std::string &line_name)
void setMeanWeight(double w_mean)
void setVisible(bool _isvisible)
void addPolygon(const int &index)
void trackMovingEdge(const vpImage< unsigned char > &I)
Implementation of a polygon of the model used by the model-based tracker.
std::string getName() const
Parse an Xml file to extract configuration parameters of a mbtConfig object.
void getCameraParameters(vpCameraParameters &cam) const
double getAngleAppear() const
void setEdgeMe(const vpMe &ecm)
void getEdgeMe(vpMe &ecm) const
double getLodMinLineLengthThreshold() const
void setAngleDisappear(const double &adisappear)
double getAngleDisappear() const
void setAngleAppear(const double &aappear)
void parse(const std::string &filename)
double getNearClippingDistance() const
bool hasNearClippingDistance() const
bool hasFarClippingDistance() const
void setCameraParameters(const vpCameraParameters &cam)
double getFarClippingDistance() const
bool getFovClipping() const
double getLodMinPolygonAreaThreshold() const
void setVerbose(bool verbose)
Performs search in a given direction(normal) for a given distance(pixels) for a given 'site'....
@ TOO_NEAR
Point not tracked anymore, since too near from its neighbor.
@ THRESHOLD
Point not tracked due to the likelihood that is below the threshold, but retained in the ME list.
@ CONTRAST
Point not tracked due to a contrast problem, but retained in the ME list.
@ M_ESTIMATOR
Point detected as an outlier during virtual visual-servoing.
@ NO_SUPPRESSION
Point successfully tracked.
vpMeSiteState getState() const
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
void setFarClippingDistance(const double &dist)
unsigned int getNbPoint() const
void setNearClippingDistance(const double &dist)
vpPoint * p
corners in the object frame
void setClipping(const unsigned int &flags)
@ TUKEY
Tukey influence function.
Error that can be emitted by the vpTracker class and its derivatives.
@ notEnoughPointError
Not enough point to track.
@ fatalError
Tracker fatal error.
vpVelocityTwistMatrix & buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)