31 #include <mrpt/otherlibs/do_opencv_includes.h>    43 #ifdef MRPT_OS_WINDOWS    71         CvPoint         min_point,max_point;
    73         bool entireImg = (x_search_ini<0 || y_search_ini<0 || x_search_size<0 || y_search_size<0);
    92         const int patch_w = patch_im.
getWidth();
    97                 x_search_size = im_w - patch_w;
    98                 y_search_size = im_h - patch_h;
   102         if ((x_search_ini + x_search_size  + patch_w)>im_w)
   103                 x_search_size -= (x_search_ini + x_search_size + patch_w) - im_w;
   105         if ((y_search_ini + y_search_size  + patch_h)>im_h)
   106                 y_search_size -= (y_search_ini + y_search_size  + patch_h) - im_h;
   108         ASSERT_( (x_search_ini + x_search_size + patch_w)<=im_w )
   109         ASSERT_( (y_search_ini + y_search_size + patch_h)<=im_h )
   111         IplImage *result = cvCreateImage(cvSize(x_search_size+1,y_search_size+1),IPL_DEPTH_32F, 1);
   113         CImage  img_region_to_search;
   123                         img_region_to_search,
   126                         patch_w+x_search_size,  
   127                         patch_h+y_search_size
   133                 img_region_to_search.
getAs<IplImage>(),
   134                 patch_im.
getAs<IplImage>(),
   140         cvMinMaxLoc(result,&mini,&max_val,&min_point,&max_point,NULL);
   145         cvReleaseImage( &result );
   148         THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_OPENCV=0 !");
   163         cvFlip(
img.getAs<IplImage>());  
   164         img.setOriginTopLeft(
true);
   166         THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_OPENCV=0 !");
   182         res.x = xy.
x - A.get_unsafe(0,2);
   183         res.y = xy.
y - A.get_unsafe(1,2);
   184         res.z = A.get_unsafe(0,0);
   187         const double    u = 
res.norm();
   198                     const double            focalLengthX,
   199                     const double            focalLengthY,
   200                     const double            centerX,
   201                     const double            centerY)
   205         A(0,0) = focalLengthX;
   206         A(1,1) = focalLengthY;
   219                                         unsigned int            camIndex,
   229                 fx=0.79345f;    fy=1.05793f;
   230                 cx=0.55662f;    cy=0.52692f;
   235                 fx=0.95666094f; fy=1.3983423f;
   236                 cx=0.54626328f; cy=0.4939191f;
   246                                                                                 resX * cx,      resY * cy );
   257         float                                   lx = 0.0, ly = 0.0;
   260         for( itList1 = feat_list.
begin(); itList1 != feat_list.
end(); itList1++)
   264                 for( itList2 = itList1; itList2 != feat_list.
end(); itList2++)
   266                         if( (lx == (*itList2)->x && ly == (*itList2)->y ) && ( (*itList2)->x > 0.0f && (*itList2)->y > 0.0f ))
   268                                 (*itList2)->x = -1.0f;
   269                                 (*itList2)->y = -1.0f;
   275         for( itList1 = feat_list.
begin(); itList1 != feat_list.
end();)
   277                 if( (*itList1)->x == -1.0f && (*itList1)->y == -1.0f )
   278                         itList1 = feat_list.
erase( itList1 );
   295         std::cout << std::endl << 
"[ROW CHECKING]------------------------------------------" << std::endl;
   298         for( itLeft = leftList.
begin(), itRight = rightList.
begin(); itLeft != leftList.
end(); )
   300                 if( (*itLeft)->x < 0 || (*itLeft)->y < 0 ||
   301                         (*itRight)->x < 0 || (*itRight)->y < 0 ||
   302                         fabs( (*itLeft)->y - (*itRight)->y ) > threshold )
   304                         std::cout << 
"[Erased Feature] Row Dif: " << fabs( (*itLeft)->y - (*itRight)->y ) << std::endl;
   305                         itLeft = leftList.
erase( itLeft );
   306                         itRight = rightList.
erase( itRight );
   315         std::cout << 
"------------------------------------------" << std::endl;
   317         std::cout << 
"Tracked features: " << leftList.
size() << 
" and " << rightList.
size() << std::endl;
   334         double varx = 0, vary = 0;
   336         for( it = list.
begin(); it != list.
end(); it++ )
   344         for( it = list.
begin(); it != list.
end(); it++ )
   352         std[0] = sqrt( varx );
   353         std[1] = sqrt( vary );
   369         for( it = feat_list.begin(); it != feat_list.end(); it++ )
   371                 err.
x = it->other_x - (it->this_x*mat.get_unsafe(0,0) + it->this_y*mat.get_unsafe(0,1) + it->this_z*mat.get_unsafe(0,2) + Rt.
x());
   372                 err.
y = it->other_y - (it->this_x*mat.get_unsafe(1,0) + it->this_y*mat.get_unsafe(1,1) + it->this_z*mat.get_unsafe(1,2) + Rt.
y());
   373                 err.
z = it->other_z - (it->this_x*mat.get_unsafe(2,0) + it->this_y*mat.get_unsafe(2,1) + it->this_z*mat.get_unsafe(2,2) + Rt.z());
   378         return( acum/feat_list.size() );
   394                         if( itLand1->ID == itLand2->ID )
   399                                 pair.
this_x = itLand1->pose_mean.x;
   400                                 pair.
this_y = itLand1->pose_mean.y;
   401                                 pair.
this_z = itLand1->pose_mean.z;
   403                                 pair.
other_x = itLand2->pose_mean.x;
   404                                 pair.
other_y = itLand2->pose_mean.y;
   405                                 pair.
other_z = itLand2->pose_mean.z;
   407                                 outList.push_back( pair );
   421         if( ( 
int(
x)-1 >= 0 ) && ( 
int(
y)-1 >= 0 ) && ( 
x+1 < 
image.getWidth() ) && ( 
y+1 < 
image.getHeight() ) )
   443     nim.resize( 
image.getHeight(), 
image.getWidth() );
   445     image.getAsMatrix( im );
   448     im.meanAndStdAll(m,
s);
   450     for( 
int k1 = 0; k1 < (int)nim.cols(); ++k1 )
   451         for( 
int k2 = 0; k2 < (int)nim.rows(); ++k2 )
   452             nim.set_unsafe( k2, k1, (im.get_unsafe(k2,k1)-m)/
s );
   472         size_t sz1 = list1.
size(), sz2 = list2.
size();
   474         ASSERT_( (sz1 > 0) && (sz2 > 0) );    
   489         double                                                  minSAD1, minSAD2;
   491         vector<int> idxLeftList, idxRightList;
   494         vector<double> distCorrs(sz1);
   496         int minLeftIdx = 0, minRightIdx;
   500         for( lFeat = 0, itList1 = list1.
begin(); itList1 != list1.
end(); ++itList1, ++lFeat )
   517                 for( rFeat = 0, itList2 = list2.
begin(); itList2 != list2.
end(); ++itList2, ++rFeat )           
   524                                         d = (*itList1)->y - (*itList2)->y;
   531                                         TPoint2D        oPoint((*itList2)->x,(*itList2)->y);
   534                                         p(0,0) = (*itList1)->x;
   535                                         p(1,0) = (*itList1)->y;
   540                                         epiLine.
coefs[0] = l(0,0);
   541                                         epiLine.
coefs[1] = l(1,0);
   542                                         epiLine.
coefs[2] = l(2,0);
   549                         bool c2 = options.
useXRestriction ? ((*itList1)->x - (*itList2)->x) > 0 : 
true;         
   559                                         ASSERT_((*itList1)->descriptors.hasDescriptorSIFT() && (*itList2)->descriptors.hasDescriptorSIFT() );
   562                                         distDesc = (*itList1)->descriptorSIFTDistanceTo( *(*itList2) );
   565                                         if( distDesc < minDist1 )
   572                                         else if ( distDesc < minDist2 )
   584                                         ASSERT_( (*itList1)->patchSize > 0 && (*itList2)->patchSize > 0 );
   596                                         else if( 
res > maxCC2 )
   605                                         ASSERT_((*itList1)->descriptors.hasDescriptorSURF() && (*itList2)->descriptors.hasDescriptorSURF() );
   608                                         distDesc = (*itList1)->descriptorSURFDistanceTo( *(*itList2) );
   611                                         if( distDesc < minDist1 )
   618                                         else if ( distDesc < minDist2 )
   627                                         ASSERT_((*itList1)->descriptors.hasDescriptorORB() && (*itList2)->descriptors.hasDescriptorORB() );
   628                                         distDesc = (*itList1)->descriptorORBDistanceTo( *(*itList2) );
   631                                         if( distDesc < minDist1 )
   638                                         else if ( distDesc < minDist2 )
   647                                         ASSERT_( (*itList1)->patchSize > 0 && (*itList2)->patchSize == (*itList1)->patchSize );
   651                                         IplImage *aux1, *aux2;
   652                                         if( (*itList1)->patch.isColor() && (*itList2)->patch.isColor() )
   654                                                 const IplImage* preAux1 = (*itList1)->patch.getAs<IplImage>();
   655                                                 const IplImage* preAux2 = (*itList2)->patch.getAs<IplImage>();
   657                                                 aux1 = cvCreateImage( cvSize( (*itList1)->patch.getHeight(), (*itList1)->patch.getWidth() ), IPL_DEPTH_8U, 1 );
   658                                                 aux2 = cvCreateImage( cvSize( (*itList2)->patch.getHeight(), (*itList2)->patch.getWidth() ), IPL_DEPTH_8U, 1 );
   660                                                 cvCvtColor( preAux1, aux1, CV_BGR2GRAY );
   661                                                 cvCvtColor( preAux2, aux2, CV_BGR2GRAY );
   665                                                 aux1 = 
const_cast<IplImage*
>((*itList1)->patch.getAs<IplImage>());
   666                                                 aux2 = 
const_cast<IplImage*
>((*itList2)->patch.getAs<IplImage>());
   683                     for( 
unsigned int ii = 0; ii < (
unsigned int)aux1->height; ++ii )       
   684                         for( 
unsigned int jj = 0; jj < (
unsigned int)aux1->width; ++jj )    
   685                             res += fabs((
double)(aux1->imageData[ii*aux1->widthStep+jj]) - ((
double)(aux2->imageData[ii*aux2->widthStep+jj])) );
   686                                         res = 
res/(255.0f*aux1->width*aux1->height);
   695                                         else if ( 
res < minSAD2 )
   704                 bool cond1 = 
false, cond2 = 
false;
   710                                 cond2 = (minDist1/minDist2) < options.
EDD_RATIO;                        
   715                                 cond2 = (maxCC2/maxCC1) < options.
rCC_TH;                                       
   720                                 cond2 = (minDist1/minDist2) < options.
EDSD_RATIO;                       
   725                                 cond2 = (minSAD1/minSAD2) < options.
SAD_RATIO;
   740                     int auxIdx = idxRightList[ minRightIdx ];
   743                         if( distCorrs[ auxIdx ] > minVal )
   748                     distCorrs[ minLeftIdx ]     = minVal;
   749                     idxLeftList[ minLeftIdx ]   = minRightIdx;
   750                     idxRightList[ minRightIdx ] = minLeftIdx;
   752                     distCorrs[ auxIdx ]         = 1.0;
   761                         idxRightList[ minRightIdx ] = minLeftIdx;
   762                         idxLeftList[ minLeftIdx ]   = minRightIdx;
   763                         distCorrs[ minLeftIdx ]     = minVal;
   773     if( !matches.empty() )
   776     for( 
int vCnt = 0; vCnt < (int)idxLeftList.size(); ++vCnt )
   780             std::pair<CFeaturePtr, CFeaturePtr> thisMatch;
   783             double dp1 = -1.0, dp2 = -1.0;
   795                 dp1 = sqrt( p3D.
x*p3D.
x + p3D.
y*p3D.
y + p3D.
z*p3D.
z );
   796                 dp2 = sqrt( (p3D.
x-
params.baseline)*(p3D.
x-
params.baseline) + p3D.
y*p3D.
y + p3D.
z*p3D.
z );
   805                 thisMatch.first     = list1[vCnt];
   806                 thisMatch.second    = list2[idxLeftList[vCnt]];
   809                 if( matches.empty() )
   811                     idLeft = thisMatch.first->ID;
   812                     idRight = thisMatch.second->ID;
   816                     keep_max( idLeft, thisMatch.first->ID );
   819                     keep_max( idRight, thisMatch.second->ID );
   826                     thisMatch.first->initialDepth   = dp1;
   827                     thisMatch.first->p3D            = p3D;
   829                     thisMatch.second->initialDepth  = dp2;
   834                 matches.push_back( thisMatch );
   838         return matches.size();
   858     int hwsize = (int)(0.5*wSize);
   863     for( it = mList.begin(); it != mList.end(); ++it )
   865         for( 
int ii = -hwsize; ii < hwsize; ++ii )
   866             for( 
int jj = -hwsize; jj < hwsize; ++jj )
   868                 idx = (int)(it->first->x) + ii;
   869                 idy = (int)(it->first->y) + jj;
   870                 if( idx >= 0 && idy >= 0 && idx < mx && idy < my )
   874         for( 
int ii = -hwsize; ii < hwsize; ++ii )
   875             for( 
int jj = -hwsize; jj < hwsize; ++jj )
   877                 idx = (int)(it->second->x) + ii;
   878                 idy = (int)(it->second->y) + jj;
   879                 if( idx >= 0 && idy >= 0 && idx < mx && idy < my )
   894     const IplImage *im1 = patch1.
getAs<IplImage>();
   895     const IplImage *im2 = patch2.
getAs<IplImage>();
   897     ASSERT_( im1->width == im2->width &&  im1->height == im2->height );
   899     for( 
unsigned int ii = 0; ii < (
unsigned int)im1->height; ++ii )       
   900         for( 
unsigned int jj = 0; jj < (
unsigned int)im1->width; ++jj )    
   901             res += fabs((
double)(im1->imageData[ii*im1->widthStep+jj]) - ((
double)(im2->imageData[ii*im2->widthStep+jj])) );
   902     return res/(255.0f*im1->width*im1->height);
   904     THROW_EXCEPTION(
"MRPT compiled without OpenCV, can't compute SAD of images!" )
   919                 outImg.
rectangle( (*it)->x-5, (*it)->y-5, (*it)->x+5, (*it)->y+5, 
TColor(255,0,0) );
   928                                         vector<TPoint3D>                        & out_points )
   931         out_points.reserve( matches.size() );
   934                 const double disp = it->first->x - it->second->x;
   939                 out_points.push_back( 
   952                     vector<TPoint3D>            & vP3D,
   955     vP3D.reserve( leftList.
size() );
   957     for( it1 = leftList.
begin(), it2 = rightList.
begin(); it1 != leftList.
end(); ++it1, ++it2)
   970                     const CFeaturePtr           & leftFeat,
   971                     const CFeaturePtr           & rightFeat,
   986     const double f0 = 600;
   987     double nfx1 = leftFeat->x, nfy1 = leftFeat->y, nfx2 = rightFeat->x; 
   989     const double x  = leftFeat->x * f0; 
   990         const double y  = leftFeat->y * f0; 
   991         const double xd = rightFeat->x * f0; 
   992         const double yd = rightFeat->y * f0; 
   994         const double f2  = f0 * f0;
   995         const double p9  = f2 * 
params.F.get_unsafe(2,2);
   996         const double Q00 = f2 * (
params.F.get_unsafe(0, 2) * 
params.F.get_unsafe(0, 2) + 
params.F.get_unsafe(1, 2) * 
params.F.get_unsafe(1, 2) + 
params.F.get_unsafe(2, 0) * 
params.F.get_unsafe(2, 0) + 
params.F.get_unsafe(2, 1) * 
params.F.get_unsafe(2, 1));
   998         double Jh  = (std::numeric_limits<double>::max)(); 
  1003         double xt  = 0, yt = 0, xtd = 0, ytd = 0; 
  1005                 const double p1 = (xh * xhd + xhd * xt + xh * xtd) * 
params.F.get_unsafe(0, 0);
  1006                 const double p2 = (xh * yhd + yhd * xt + xh * ytd) * 
params.F.get_unsafe(0, 1);
  1007                 const double p3 = (f0 * (xh + xt))                 * 
params.F.get_unsafe(0, 2);
  1008                 const double p4 = (yh * xhd + xhd * yt + yh * xtd) * 
params.F.get_unsafe(1, 0);
  1009                 const double p5 = (yh * yhd + yhd * yt + yh * ytd) * 
params.F.get_unsafe(1, 1);
  1010                 const double p6 = (f0 * (yh + yt))                 * 
params.F.get_unsafe(1, 2);
  1011                 const double p7 = (f0 * (xhd + xtd))               * 
params.F.get_unsafe(2, 0);
  1012                 const double p8 = (f0 * (yhd + ytd))               * 
params.F.get_unsafe(2, 1);
  1014                 const double udotxi = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
  1016                 const double Q11 = (xh * xh + xhd * xhd) * 
params.F.get_unsafe(0, 0) * 
params.F.get_unsafe(0, 0);
  1017                 const double Q22 = (xh * xh + yhd * yhd) * 
params.F.get_unsafe(0, 1) * 
params.F.get_unsafe(0, 1);
  1018                 const double Q44 = (yh * yh + xhd * xhd) * 
params.F.get_unsafe(1, 0) * 
params.F.get_unsafe(1, 0);
  1019                 const double Q55 = (yh * yh + yhd * yhd) * 
params.F.get_unsafe(1, 1) * 
params.F.get_unsafe(1, 1);
  1020                 const double Q12 = xhd * yhd             * 
params.F.get_unsafe(0, 0) * 
params.F.get_unsafe(0, 1);
  1021                 const double Q13 = f0  * xhd             * 
params.F.get_unsafe(0, 0) * 
params.F.get_unsafe(0, 2);
  1022                 const double Q14 = xh  * yh              * 
params.F.get_unsafe(0, 0) * 
params.F.get_unsafe(1, 0);
  1023                 const double Q17 = f0  * xh              * 
params.F.get_unsafe(0, 0) * 
params.F.get_unsafe(2, 0);
  1024                 const double Q23 = f0  * yhd             * 
params.F.get_unsafe(0, 1) * 
params.F.get_unsafe(0, 2);
  1025                 const double Q25 = xh  * yh              * 
params.F.get_unsafe(0, 1) * 
params.F.get_unsafe(1, 1);
  1026                 const double Q28 = f0  * xh              * 
params.F.get_unsafe(0, 1) * 
params.F.get_unsafe(2, 1);
  1027                 const double Q45 = xhd * yhd             * 
params.F.get_unsafe(1, 0) * 
params.F.get_unsafe(1, 1);
  1028                 const double Q46 = f0  * xhd             * 
params.F.get_unsafe(1, 0) * 
params.F.get_unsafe(1, 2);
  1029                 const double Q47 = f0  * yh              * 
params.F.get_unsafe(1, 0) * 
params.F.get_unsafe(2, 0);
  1030                 const double Q56 = f0  * yhd             * 
params.F.get_unsafe(1, 1) * 
params.F.get_unsafe(1, 2);
  1031                 const double Q58 = f0  * yh              * 
params.F.get_unsafe(1, 1) * 
params.F.get_unsafe(2, 1);
  1033                 const double udotV0xiu = Q00 + Q11 + Q22 + Q44 + Q55
  1034                         + 2.0 * (Q12 + Q13 + Q14 + Q17 + Q23 + Q25 + Q28 + Q45 + Q46 + Q47 + Q56 + Q58);
  1036                 ASSERT_( fabs(udotV0xiu) > 1e-5 );
  1038                 const double C = udotxi / udotV0xiu;
  1040                 xt  = C * (
params.F.get_unsafe(0, 0) * xhd + 
params.F.get_unsafe(0, 1) * yhd + f0 * 
params.F.get_unsafe(0, 2));
  1041                 yt  = C * (
params.F.get_unsafe(1, 0) * xhd + 
params.F.get_unsafe(1, 1) * yhd + f0 * 
params.F.get_unsafe(1, 2));
  1042                 xtd = C * (
params.F.get_unsafe(0, 0) * xh  + 
params.F.get_unsafe(1, 0) * yh  + f0 * 
params.F.get_unsafe(2, 0));
  1043                 ytd = C * (
params.F.get_unsafe(0, 1) * xh  + 
params.F.get_unsafe(1, 1) * yh  + f0 * 
params.F.get_unsafe(2, 1));
  1045                 const double Jt = xt * xt + yt * yt + xtd * xtd + ytd * ytd;
  1047                 if ((std::abs)(Jt - Jh) <= 1e-5) {
  1064         double disp = nfx1 - nfx2;
  1065         double aux  = 
params.baseline/disp;
  1066         p3D.
x = (nfx1-
params.K(0,2))*aux;
  1067         p3D.
y = (nfy1-
params.K(1,2))*aux;
  1088         for(itList = mfList.begin(); itList != mfList.end();)
  1090                 float disp = ( itList->first->x - itList->second->x );  
  1092                         itList = mfList.erase( itList );                                        
  1097                         float x3D = ( itList->first->x - 
param.K(0,2) ) * ( (
param.baseline) ) / disp;
  1098                         float y3D = ( itList->first->y - 
param.K(1,2) ) * ( (
param.baseline) ) / disp;
  1099                         float z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / disp;
  1102                         if ( (z3D < 
param.minZ) || (z3D > 
param.maxZ) )
  1103                                 itList = mfList.erase( itList );                                        
  1112                                 norm3D *= -1/norm3D.
norm();
  1116                                 lm.
ID = itList->first->ID;
  1124                                 switch( 
param.uncPropagation )
  1130                                         float c0        = 
param.K(0,2);
  1131                                         float r0        = 
param.K(1,2);
  1133                                         float disp2     = 
square( itList->first->x - itList->second->x );
  1136                                         lm.
pose_cov_12 = stdDisp2*base2*( itList->first->x - c0 )*( itList->first->y - r0 )/
square(disp2);
  1137                                         lm.
pose_cov_13 = stdDisp2*base2*sqrt(foc2)*( itList->first->x - c0 )/
square(disp2);
  1139                                         lm.
pose_cov_23 = stdDisp2*base2*sqrt(foc2)*( itList->first->y - r0 )/
square(disp2);
  1147                                         unsigned int                    Na = 3;
  1150                                         float                                   k = 
param.factor_k;
  1152                                         float                                   w0 = k/(Na + k);
  1153                                         float                                   w1 = 1/(2*(Na + k));
  1159                                         Pa(0,0) = Pa(1,1) = ( Na + k ) * 
square( 
param.stdPixel );
  1169                                         B.resize( 2*Na + 1 );   
  1180                                         meanA[0] = itList->first->x;
  1181                                         meanA[1] = itList->first->y;
  1185                                         meanB.
x = w0*x3D; meanB.
y = w0*y3D; meanB.
z = w0*z3D;   
  1186                                         B[0].x = x3D; B[0].y = y3D; B[0].z = z3D;                               
  1188                                         for( i = 1; i <= 2*Na; i++ )
  1193                                                         L.extractRowAsCol( i-1, vAux );                                         
  1194                                                         myPoint[0] = meanA[0] + vAux[0];
  1195                                                         myPoint[1] = meanA[1] + vAux[1];
  1196                                                         myPoint[2] = meanA[2] + vAux[2];
  1200                                                         L.extractRowAsCol( (i-Na)-1, vAux );                                    
  1201                                                         myPoint[0] = meanA[0] - vAux[0];
  1202                                                         myPoint[1] = meanA[1] - vAux[1];
  1203                                                         myPoint[2] = meanA[2] - vAux[2];
  1207                                                 x3D = ( myPoint[0] - 
param.K(0,2) ) * ( (
param.baseline) ) / myPoint[2];
  1208                                                 y3D = ( myPoint[1] - 
param.K(1,2) ) * ( (
param.baseline) ) / myPoint[2];
  1209                                                 z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / myPoint[2];
  1212                                                 meanB.
x = meanB.
x + 
w1*x3D;
  1213                                                 meanB.
y = meanB.
y + 
w1*y3D;
  1214                                                 meanB.
z = meanB.
z + 
w1*z3D;
  1223                                         for( i = 0; i <= 2*Na; i++ )
  1231                                                 v(0,0) = B[i].x - meanB.
x;
  1232                                                 v(1,0) = B[i].y - meanB.
y;
  1233                                                 v(2,0) = B[i].z - meanB.
z;
  1235                                                 Pb = Pb + weight*(
v*
v.transpose());
  1251                                         unsigned int                    Na = 3;
  1254                                         float                                   a = 
param.factor_a;
  1255                                         float                                   b = 
param.factor_b;
  1256                                         float                                   k = 
param.factor_k;
  1258                                         float                                   lambda = 
square(
a)*(Na + k) - Na;
  1260                                         float                                   w0_m = lambda/(Na + lambda);
  1261                                         float                                   w0_c = w0_m + (1 - 
square(
a) + 
b);
  1262                                         float                                   w1 = 1/(2*(Na + lambda));
  1268                                         Pa(0,0) = Pa(1,1) = ( Na + lambda ) * 
square( 
param.stdPixel );
  1269                                         Pa(2,2) = ( Na + lambda ) * 
square( 
param.stdDisp );
  1278                                         B.resize( 2*Na + 1 );   
  1289                                         meanA[0] = itList->first->x;
  1290                                         meanA[1] = itList->first->y;
  1294                                         meanB.
x = w0_m*x3D; meanB.
y = w0_m*y3D; meanB.
z = w0_m*z3D;             
  1295                                         B[0].x = x3D; B[0].y = y3D; B[0].z = z3D;                                               
  1297                                         for( i = 1; i <= 2*Na; i++ )
  1302                                                         L.extractRowAsCol( i-1, vAux );                                         
  1303                                                         myPoint = meanA + vAux;
  1310                                                         L.extractRowAsCol( (i-Na)-1, vAux );                                    
  1311                                                         myPoint = meanA - vAux;
  1318                                                 x3D = ( myPoint[0] - 
param.K(0,2) ) * ( (
param.baseline) ) / myPoint[2];
  1319                                                 y3D = ( myPoint[1] - 
param.K(1,2) ) * ( (
param.baseline) ) / myPoint[2];
  1320                                                 z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / myPoint[2];
  1323                                                 meanB.
x = meanB.
x + 
w1*x3D;
  1324                                                 meanB.
y = meanB.
y + 
w1*y3D;
  1325                                                 meanB.
z = meanB.
z + 
w1*z3D;
  1334                                         for( i = 0; i <= 2*Na; i++ )
  1342                                                 v(0,0) = B[i].x - meanB.
x;
  1343                                                 v(1,0) = B[i].y - meanB.
y;
  1344                                                 v(2,0) = B[i].z - meanB.
z;
  1346                                                 Pb = Pb + weight*(
v*
v.transpose());
  1388         for(itListL = leftList.
begin(), itListR = rightList.
begin(); itListL != leftList.
end();)
  1390                 float disp = ( (*itListL)->x - (*itListR)->x ); 
  1393                         itListL = leftList.
erase( itListL );            
  1394                         itListR = rightList.
erase( itListR );           
  1399                         float x3D = ( (*itListL)->x - 
param.K(0,2) ) * ( (
param.baseline) ) / disp;
  1400                         float y3D = ( (*itListL)->y - 
param.K(1,2) ) * ( (
param.baseline) ) / disp;
  1401                         float z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / disp;
  1404                         if ( (z3D < 
param.minZ) || (z3D > 
param.maxZ) )
  1406                                 itListL = leftList.
erase( itListL );            
  1407                                 itListR = rightList.
erase( itListR );           
  1417                                 norm3D *= -1/norm3D.
norm();
  1421                                 lm.
ID = (*itListL)->ID;
  1430                                 switch( 
param.uncPropagation )
  1436                                         float c0        = 
param.K(0,2);
  1437                                         float r0        = 
param.K(1,2);
  1439                                         float disp2     = 
square( (*itListL)->x - (*itListR)->x );
  1442                                         lm.
pose_cov_12 = stdDisp2*base2*( (*itListL)->x - c0 )*( (*itListL)->y - r0 )/
square(disp2);
  1443                                         lm.
pose_cov_13 = stdDisp2*base2*sqrt(foc2)*( (*itListL)->x - c0 )/
square(disp2);
  1445                                         lm.
pose_cov_23 = stdDisp2*base2*sqrt(foc2)*( (*itListL)->y - r0 )/
square(disp2);
  1453                                         unsigned int                    Na = 3;
  1456                                         float                                   k = 
param.factor_k;
  1458                                         float                                   w0 = k/(Na + k);
  1459                                         float                                   w1 = 1/(2*(Na + k));
  1465                                         Pa(0,0) = Pa(1,1) = ( Na + k ) * 
square( 
param.stdPixel );
  1475                                         B.resize( 2*Na + 1 );   
  1486                                         meanA[0] = (*itListL)->x;
  1487                                         meanA[1] = (*itListL)->y;
  1491                                         meanB.
x = w0*x3D; meanB.
y = w0*y3D; meanB.
z = w0*z3D;   
  1492                                         B[0].x = x3D; B[0].y = y3D; B[0].z = z3D;                               
  1494                                         for( i = 1; i <= 2*Na; i++ )
  1499                                                         L.extractRowAsCol( i-1, vAux );                                         
  1500                                                         myPoint[0] = meanA[0] + vAux[0];
  1501                                                         myPoint[1] = meanA[1] + vAux[1];
  1502                                                         myPoint[2] = meanA[2] + vAux[2];
  1506                                                         L.extractRowAsCol( (i-Na)-1, vAux );                                    
  1507                                                         myPoint[0] = meanA[0] - vAux[0];
  1508                                                         myPoint[1] = meanA[1] - vAux[1];
  1509                                                         myPoint[2] = meanA[2] - vAux[2];
  1513                                                 x3D = ( myPoint[0] - 
param.K(0,2) ) * ( (
param.baseline) ) / myPoint[2];
  1514                                                 y3D = ( myPoint[1] - 
param.K(1,2) ) * ( (
param.baseline) ) / myPoint[2];
  1515                                                 z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / myPoint[2];
  1518                                                 meanB.
x = meanB.
x + 
w1*x3D;
  1519                                                 meanB.
y = meanB.
y + 
w1*y3D;
  1520                                                 meanB.
z = meanB.
z + 
w1*z3D;
  1529                                         for( i = 0; i <= 2*Na; i++ )
  1537                                                 v(0,0) = B[i].x - meanB.
x;
  1538                                                 v(1,0) = B[i].y - meanB.
y;
  1539                                                 v(2,0) = B[i].z - meanB.
z;
  1541                                                 Pb = Pb + weight*(
v*
v.transpose());
  1557                                         unsigned int                    Na = 3;
  1560                                         float                                   a = 
param.factor_a;
  1561                                         float                                   b = 
param.factor_b;
  1562                                         float                                   k = 
param.factor_k;
  1564                                         float                                   lambda = 
square(
a)*(Na + k) - Na;
  1566                                         float                                   w0_m = lambda/(Na + lambda);
  1567                                         float                                   w0_c = w0_m + (1 - 
square(
a) + 
b);
  1568                                         float                                   w1 = 1/(2*(Na + lambda));
  1574                                         Pa(0,0) = Pa(1,1) = ( Na + lambda ) * 
square( 
param.stdPixel );
  1575                                         Pa(2,2) = ( Na + lambda ) * 
square( 
param.stdDisp );
  1584                                         B.resize( 2*Na + 1 );   
  1595                                         meanA[0] = (*itListL)->x;
  1596                                         meanA[1] = (*itListL)->y;
  1600                                         meanB.
x = w0_m*x3D; meanB.
y = w0_m*y3D; meanB.
z = w0_m*z3D;             
  1601                                         B[0].x = x3D; B[0].y = y3D; B[0].z = z3D;                                               
  1603                                         for( i = 1; i <= 2*Na; i++ )
  1608                                                         L.extractRowAsCol( i-1, vAux );                                         
  1609                                                         myPoint = meanA + vAux;
  1616                                                         L.extractRowAsCol( (i-Na)-1, vAux );                                    
  1617                                                         myPoint = meanA - vAux;
  1624                                                 x3D = ( myPoint[0] - 
param.K(0,2) ) * ( (
param.baseline) ) / myPoint[2];
  1625                                                 y3D = ( myPoint[1] - 
param.K(1,2) ) * ( (
param.baseline) ) / myPoint[2];
  1626                                                 z3D = ( 
param.K(0,0) ) * ( (
param.baseline) ) / myPoint[2];
  1629                                                 meanB.
x = meanB.
x + 
w1*x3D;
  1630                                                 meanB.
y = meanB.
y + 
w1*y3D;
  1631                                                 meanB.
z = meanB.
z + 
w1*z3D;
  1640                                         for( i = 0; i <= 2*Na; i++ )
  1648                                                 v(0,0) = B[i].x - meanB.
x;
  1649                                                 v(1,0) = B[i].y - meanB.
y;
  1650                                                 v(2,0) = B[i].z - meanB.
z;
  1652                                                 Pb = Pb + weight*(
v*
v.transpose());
  1682                     const double                        & baseline,
  1684                     const vector<double>                & sg,
  1689         double f                = intrinsicParams(0,0);                         
  1690         double x0               = intrinsicParams(0,2);                         
  1691         double y0               = intrinsicParams(1,2);                         
  1692         double b                = baseline;                                                     
  1693         double sg_c2    = 
square( sg[0] );                                      
  1694         double sg_r2    = 
square( sg[1] );                                      
  1695         double sg_d2    = 
square( sg[2] );                                      
  1698                         itMatchList != inMatches.end();
  1701                 double x        = itMatchList->first->x;                        
  1702                 double y        = itMatchList->first->y;                        
  1704                 double d        = itMatchList->first->x - itMatchList->second->x;       
  1710                 double X        = ( 
x - x0 ) * 
b / d;
  1711                 double Y        = ( 
y - y0 ) * 
b / d;
  1712                 double Z        = f * 
b / d;
  1722                 m.
yaw   = atan2( Y,X );
  1735                  aux.get_unsafe( 0, 0 ) = k*(sg_c2 + sg_d2*
square(
x-x0)/d2);
  1736                  aux.get_unsafe( 0, 1 ) = aux.get_unsafe( 1, 0 ) = k*(sg_d2*(
x-x0)*(
y-y0)/d2);
  1737                  aux.get_unsafe( 0, 2 ) = aux.get_unsafe( 2, 0 ) = k*(sg_d2*(
x-x0)*f/d2);
  1739                  aux.get_unsafe( 1, 1 ) = k*(sg_r2 + sg_d2*
square(
y-y0)/d2);
  1740                  aux.get_unsafe( 1, 2 ) = aux.get_unsafe( 2, 1 ) = k*(sg_d2*(
y-y0)*f/d2);
  1742                  aux.get_unsafe( 2, 2 ) = k*(sg_d2*
square(f)/d2);
  1763                 JG.set_unsafe( 0, 0, X/m.
range );
  1764                 JG.set_unsafe( 0, 1, Y/m.
range );
  1765                 JG.set_unsafe( 0, 2, Z/m.
range );
  1769                 JG.set_unsafe( 1, 2, 0 );
  1801                     const vector<double>                & sg,
  1808         unsigned int            id = 0;
  1828         double sg_c2    = 
square( sg[0] );                                      
  1829         double sg_r2    = 
square( sg[1] );                                      
  1830         double sg_d2    = 
square( sg[2] );                                      
  1833                         itMatchList != matchList.end();
  1834                         itMatchList++, 
id++ )
  1836                 double x        = itMatchList->first->x;                        
  1837                 double y        = itMatchList->first->y;                        
  1839                 double d        = itMatchList->first->x - itMatchList->second->x;       
  1845                 double X        = ( 
x - x0 ) * 
b / d;
  1846                 double Y        = ( 
y - y0 ) * 
b / d;
  1847                 double Z        = f * 
b / d;
  1859                 m.
yaw   = atan2( X,Z );
  1860                 m.
pitch = atan2( Y,Z );
  1871                  aux.get_unsafe( 0, 0 ) = k*(sg_c2 + sg_d2*
square(
x-x0)/d2);
  1872                  aux.get_unsafe( 0, 1 ) = aux.get_unsafe( 1, 0 ) = k*(sg_d2*(
x-x0)*(
y-y0)/d2);
  1873                  aux.get_unsafe( 0, 2 ) = aux.get_unsafe( 2, 0 ) = k*(sg_d2*(
x-x0)*f/d2);
  1875                  aux.get_unsafe( 1, 1 ) = k*(sg_r2 + sg_d2*
square(
y-y0)/d2);
  1876                  aux.get_unsafe( 1, 2 ) = aux.get_unsafe( 2, 1 ) = k*(sg_d2*(
y-y0)*f/d2);
  1878                  aux.get_unsafe( 2, 2 ) = k*(sg_d2*
square(f)/d2);
  1899                 JG.set_unsafe( 0, 0, X/m.
range );
  1900                 JG.set_unsafe( 0, 1, Y/m.
range );
  1901                 JG.set_unsafe( 0, 2, Z/m.
range );
  1905                 JG.set_unsafe( 1, 2, 0 );
  1952                 m.
yaw                   = atan2( itCloud->pose_mean.y, itCloud->pose_mean.x );
  1953                 m.
pitch                 = -sin( itCloud->pose_mean.z/m.
range );
  1974 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM>=0x211  1976     cv::Mat *mapx1, *mapy1, *mapx2, *mapy2;
  1977     mapx1 = 
static_cast<cv::Mat*
>(outMap1x);
  1978     mapy1 = 
static_cast<cv::Mat*
>(outMap1y);
  1979     mapx2 = 
static_cast<cv::Mat*
>(outMap2x);
  1980     mapy2 = 
static_cast<cv::Mat*
>(outMap2y);
  1982     const int resX = cam1.
ncols;
  1983     const int resY = cam1.
nrows;
  1989         rcTrans[0] = hMatrix(0,3);
  1990         rcTrans[1] = hMatrix(1,3);
  1991         rcTrans[2] = hMatrix(2,3);
  1994     for(
unsigned int i = 0; i < 3; ++i)
  1995         for(
unsigned int j = 0; j < 3; ++j)
  1996             m1[i][j] = hMatrix(i,j);
  1998     double ipl[3][3], ipr[3][3], dpl[5], dpr[5];
  1999     for( 
unsigned int i = 0; i < 3; ++i )
  2000         for( 
unsigned int j = 0; j < 3; ++j )
  2006     for( 
unsigned int i = 0; i < 5; ++i )
  2008         dpl[i] = cam1.
dist[i];
  2009         dpr[i] = cam2.
dist[i];
  2012     cv::Mat 
R( 3, 3, CV_64F, &m1 );
  2013     cv::Mat T( 3, 1, CV_64F, &rcTrans );
  2015     cv::Mat K1(3,3,CV_64F,ipl);
  2016     cv::Mat K2(3,3,CV_64F,ipr);
  2017     cv::Mat D1(1,5,CV_64F,dpl);
  2018     cv::Mat D2(1,5,CV_64F,dpr);
  2020     double _R1[3][3], _R2[3][3], _P1[3][4], _P2[3][4], _Q[4][4];
  2021     cv::Mat R1(3,3,CV_64F,_R1);
  2022     cv::Mat R2(3,3,CV_64F,_R2);
  2023     cv::Mat P1(3,4,CV_64F,_P1);
  2024     cv::Mat P2(3,4,CV_64F,_P2);
  2025     cv::Mat Q(4,4,CV_64F,_Q);
  2027     cv::Size nSize(resX,resY);
  2030 #if MRPT_OPENCV_VERSION_NUM<0x210  2038                 cv::CALIB_ZERO_DISPARITY
  2040 #elif MRPT_OPENCV_VERSION_NUM<0x230  2051                 cv::CALIB_ZERO_DISPARITY
  2061                 cv::CALIB_ZERO_DISPARITY,
  2068     cv::initUndistortRectifyMap( K1, D1, R1, P1, cv::Size(resX,resY), CV_32FC1, *mapx1, *mapy1 );
  2069     cv::initUndistortRectifyMap( K2, D2, R2, P2, cv::Size(resX,resY), CV_32FC1, *mapx2, *mapy2 );
  2072     THROW_EXCEPTION(
"The MRPT has been compiled with MRPT_HAS_OPENCV = 0 or OpenCV version is < 2.1.1!");
  2082 vision::TROI::TROI(
float x1, 
float x2, 
float y1, 
float y2, 
float z1, 
float z2) : xMin(x1), xMax(x2), yMin(y1), yMax(y2), zMin(z1), zMax(z2)
  2102         uncPropagation( Prop_Linear ),
  2103         baseline ( 0.119f ),    
  2115     F.set_unsafe(1,2,-1);
  2116     F.set_unsafe(2,1,1);
  2124                 const string                    & section)
  2143         for (
unsigned int ii = 0; ii < 3; ++ii )
  2144         for (
unsigned int jj = 0; jj < 3; ++jj)
  2145             K(ii,jj) = k_vec[ii*3+jj];
  2149         for (
unsigned int ii = 0; ii < 3; ++ii )
  2150         for (
unsigned int jj = 0; jj < 3; ++jj)
  2151             F(ii,jj) = f_vec[ii*3+jj];
  2170         out.
printf(
"\n----------- [vision::TStereoSystemParams] ------------ \n");
  2171         out.
printf(
"Method for 3D Uncert. \t= ");
  2175                 out.
printf(
"Linear propagation\n");
  2178                 out.
printf(
"Unscented Transform\n");
  2181                 out.
printf(
"Scaled Unscented Transform\n");
  2185         out.
printf(
"K\t\t\t= [%f\t%f\t%f]\n", 
K(0,0), 
K(0,1), 
K(0,2));
  2186         out.
printf(
" \t\t\t  [%f\t%f\t%f]\n", 
K(1,0), 
K(1,1), 
K(1,2));
  2187         out.
printf(
" \t\t\t  [%f\t%f\t%f]\n", 
K(2,0), 
K(2,1), 
K(2,2));
  2189         out.
printf(
"F\t\t\t= [%f\t%f\t%f]\n", 
F(0,0), 
F(0,1), 
F(0,2));
  2190         out.
printf(
" \t\t\t  [%f\t%f\t%f]\n", 
F(1,0), 
F(1,1), 
F(1,2));
  2191         out.
printf(
" \t\t\t  [%f\t%f\t%f]\n", 
F(2,0), 
F(2,1), 
F(2,2));
  2203         out.
printf(
"-------------------------------------------------------- \n");
  2211         useEpipolarRestriction ( true ),        
  2212         hasFundamentalMatrix ( false ),         
  2213         parallelOpticalAxis ( true ),           
  2214         useXRestriction ( true ),                       
  2215         addMatches( false ),
  2216         useDisparityLimits( false ),
  2218         min_disp(1.0f), max_disp(1e4f),
  2220         matching_method ( mmCorrelation ),      
  2221         epipolar_TH     ( 1.5f ),                               
  2224         maxEDD_TH       ( 90.0f ),                                      
  2229         minDCC_TH       ( 0.025f ),                             
  2233         maxEDSD_TH      ( 0.15f ),                              
  2234         EDSD_RATIO  ( 0.6f ),                           
  2241         estimateDepth       ( false ),
  2242         maxDepthThreshold   ( 15.0 )
  2251                 const string                    & section )
  2309         out.
printf(
"\n----------- [vision::TMatchingOptions] ------------ \n");
  2310         out.
printf(
"Matching method:                ");
  2314                 out.
printf(
"Cross Correlation\n");
  2320                 out.
printf(
"SIFT descriptor\n");
  2325                 out.
printf(
"SURF descriptor\n");
  2340         out.
printf(
"Using epipolar restriction?:    ");
  2342         out.
printf(
"Has Fundamental Matrix?:        ");
  2344         out.
printf(
"Are camera axis parallel?:      ");
  2346         out.
printf(
"Use X-coord restriction?:       ");
  2348         out.
printf(
"Use disparity limits?:       ");
  2352         out.
printf(
"Estimate depth?:                ");
  2362         out.
printf(
"Add matches to list?:           ");
  2364     out.
printf(
"-------------------------------------------------------- \n");
 void clear()
Erase all the contents of the map. 
 
void VISION_IMPEXP projectMatchedFeatures(const CMatchedFeatureList &matches, const mrpt::utils::TStereoCamera &stereo_camera, std::vector< mrpt::math::TPoint3D > &out_points)
 
float fieldOfView_yaw
Information about the sensor: Ranges, in meters (0: there is no limits) 
 
A pair (x,y) of pixel coordinates (subpixel resolution). 
 
float EDD_RATIO
Boundary Ratio between the two lowest EDD. 
 
double x() const
Common members of all points & poses classes. 
 
TMatchingOptions()
Constructor. 
 
GLclampf GLclampf GLclampf alpha
 
float rCC_TH
Maximum Ratio Between the two highest CC values. 
 
mrpt::math::CMatrixDouble33 F
Stereo Fundamental matrix. 
 
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
 
double VISION_IMPEXP computeSAD(const mrpt::utils::CImage &patch1, const mrpt::utils::CImage &patch2)
Calculates the Sum of Absolutes Differences (range [0,1]) between two patches. 
 
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL. 
 
double maxORB_dist
Maximun distance between ORB descriptors. 
 
Declares a matrix of booleans (non serializable). 
 
mrpt::utils::CImage imageLeft
Image from the left camera (this image will be ALWAYS present) 
 
float range
The sensed landmark distance, in meters. 
 
bool estimateDepth
Whether or not estimate the 3D position of the real features for the matches (only with parallelOptic...
 
This namespace provides a OS-independent interface to many useful functions: filenames manipulation...
 
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
 
bool useXRestriction
Whether or not employ the x-coord restriction for finding correspondences (bumblebee camera...
 
void VISION_IMPEXP cloudsToMatchedList(const mrpt::obs::CObservationVisualLandmarks &cloud1, const mrpt::obs::CObservationVisualLandmarks &cloud2, mrpt::utils::TMatchingPairList &outList)
Transform two clouds of 3D points into a matched list of points ... 
 
A class for storing images as grayscale or RGB bitmaps. 
 
Linear propagation of the uncertainty. 
 
void setRightMaxID(const TFeatureID &rightID)
 
double SAD_RATIO
Boundary Ratio between the two highest SAD. 
 
#define THROW_EXCEPTION(msg)
 
void resize(unsigned int width, unsigned int height, TImageChannels nChannels, bool originTopLeft)
Changes the size of the image, erasing previous contents (does NOT scale its current content...
 
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
 
void VISION_IMPEXP StereoObs2BRObs(const mrpt::obs::CObservationStereoImages &inObs, const std::vector< double > &sg, mrpt::obs::CObservationBearingRange &outObs)
Converts a stereo images observation into a bearing and range observation. 
 
double cy() const
Get the value of the principal point y-coordinate (in pixels). 
 
Declares a class derived from "CObservation" that stores a Landmarks Map as seen from a stereo camera...
 
double norm() const
Point norm. 
 
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction...
 
GLenum GLsizei GLenum GLenum const GLvoid * image
 
TInternalFeatList::const_iterator const_iterator
 
void rectangle(int x0, int y0, int x1, int y1, const mrpt::utils::TColor color, unsigned int width=1)
Draws a rectangle (an empty rectangle, without filling) 
 
float epipolar_TH
Epipolar constraint (rows of pixels) 
 
const Scalar * const_iterator
 
float minZ
Maximum allowed distance. 
 
float EDSD_RATIO
Boundary Ratio between the two lowest SURF EDSD. 
 
void VISION_IMPEXP addFeaturesToImage(const mrpt::utils::CImage &inImg, const CFeatureList &theList, mrpt::utils::CImage &outImg)
Draw rectangles around each of the features on a copy of the input image. 
 
double z
X,Y,Z coordinates. 
 
bool useEpipolarRestriction
Whether or not take into account the epipolar restriction for finding correspondences. 
 
void VISION_IMPEXP projectMatchedFeature(const CFeaturePtr &leftFeat, const CFeaturePtr &rightFeat, mrpt::math::TPoint3D &p3D, const TStereoSystemParams ¶ms=TStereoSystemParams())
Computes the 3D position of a particular matched feature. 
 
Matching by Hamming distance between ORB descriptors. 
 
const T * getAs() const
Returns a pointer to a const T* containing the image - the idea is to call like "img.getAs<IplImage>()" so we can avoid here including OpenCV's headers. 
 
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) MRPT_OVERRIDE
This method load the options from a ".ini"-like file or memory-stored string list. 
 
float factor_k
K factor for the UT. 
 
Structure to hold the parameters of a pinhole stereo camera model. 
 
This class allows loading and storing values and vectors of different types from a configuration text...
 
T square(const T x)
Inline function for the square of a number. 
 
bool useDisparityLimits
Whether or not use limits (min,max) for the disparity, see also 'min_disp, max_disp'. 
 
float stdPixel
Standard deviation of the error in feature detection. 
 
std::vector< mrpt::vision::CFeaturePtr > features
The set of features from which the landmark comes. 
 
float yaw
The sensed landmark direction, in radians, measured as the yaw (azimuth) and pitch (negative elevatio...
 
mrpt::math::TPoint3D VISION_IMPEXP pixelTo3D(const mrpt::utils::TPixelCoordf &xy, const mrpt::math::CMatrixDouble33 &A)
Extract a UNITARY 3D vector in the direction of a 3D point, given from its (x,y) pixels coordinates...
 
double fx() const
Get the value of the focal length x-value (in pixels). 
 
int read_int(const std::string §ion, const std::string &name, int defaultValue, bool failIfNotFound=false) const
 
mrpt::poses::CPose3DQuat cameraPose
The pose of the LEFT camera, relative to the robot. 
 
int32_t landmarkID
The ID of the sensed beacon, or INVALID_LANDMARK_ID (-1) if the sensor does not identify the landmark...
 
Matching by Euclidean distance between SIFT descriptors. 
 
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
 
bool parallelOpticalAxis
Whether or not the stereo rig has the optical axes parallel. 
 
float minDCC_TH
Minimum Difference Between the Maximum Cross Correlation Values. 
 
This base provides a set of functions for maths stuff. 
 
A class for storing a map of 3D probabilistic landmarks. 
 
TUnc_Prop_Method uncPropagation
 
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler. 
 
void getMaxID(const TListIdx &idx, TFeatureID &firstListID, TFeatureID &secondListID)
Returns the maximum ID of the features in the list. 
 
Parameters associated to a stereo system. 
 
bool addMatches
Whether or not to add the matches found into the input matched list (if false the input list will be ...
 
void push_back(const CLandmark &lm)
The object is copied, thus the original copy passed as a parameter can be released. 
 
Matching by Euclidean distance between SURF descriptors. 
 
void VISION_IMPEXP openCV_cross_correlation(const mrpt::utils::CImage &img, const mrpt::utils::CImage &patch_img, size_t &x_max, size_t &y_max, double &max_val, int x_search_ini=-1, int y_search_ini=-1, int x_search_size=-1, int y_search_size=-1)
Computes the correlation between this image and another one, encapsulating the openCV function cvMatc...
 
void read_vector(const std::string §ion, const std::string &name, const VECTOR_TYPE &defaultValue, VECTOR_TYPE &outValues, bool failIfNotFound=false) const
Reads a configuration parameter of type vector, stored in the file as a string: "[v1 v2 v3 ...
 
float max_disp
Disparity limits, see also 'useDisparityLimits'. 
 
float maxY
Maximum allowed height. 
 
CImage grayscale() const
Returns a grayscale version of the image, or itself if it is already a grayscale image. 
 
Observation class for either a pair of left+right or left+disparity images from a stereo camera...
 
float fieldOfView_pitch
Information about the sensor: The "field-of-view" of the sensor, in radians (for pitch )...
 
This namespace contains representation of robot actions and observations. 
 
double coefs[3]
Line coefficients, stored as an array: . 
 
Classes for computer vision, detectors, features, etc. 
 
double VISION_IMPEXP computeMsd(const mrpt::utils::TMatchingPairList &list, const poses::CPose3D &Rt)
Computes the mean squared distance between a set of 3D correspondences ... 
 
Uncertainty propagation through the Unscented Transformation. 
 
double maxDepthThreshold
The maximum allowed depth for the matching. If its computed depth is larger than this, the match won't be considered. 
 
iterator erase(const iterator &it)
 
uint64_t TFeatureID
Definition of a feature ID. 
 
void setFromIplImageReadOnly(void *iplImage)
Reads the image from a OpenCV IplImage object (WITHOUT making a copy) and from now on the image canno...
 
void VISION_IMPEXP flip(mrpt::utils::CImage &img)
Invert an image using OpenCV function. 
 
void set_unsafe(size_t row, size_t col, const T &v)
Fast but unsafe method to write a value in the matrix. 
 
double cx() const
Get the value of the principal point x-coordinate (in pixels). 
 
mrpt::utils::TCamera leftCamera
Parameters for the left/right cameras: individual intrinsic and distortion parameters of the cameras...
 
A list of visual features, to be used as output by detectors, as input/output by trackers, etc. 
 
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
 
void VISION_IMPEXP rowChecking(CFeatureList &leftList, CFeatureList &rightList, float threshold=1.0)
Search for correspondences which are not in the same row and deletes them. 
 
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
 
float VISION_IMPEXP computeMainOrientation(const mrpt::utils::CImage &image, unsigned int x, unsigned int y)
Computes the main orientation of a set of points with an image (for using in SIFT-based algorithms) ...
 
void setSensorPose(const mrpt::poses::CPose3D &newSensorPose) MRPT_OVERRIDE
A general method to change the sensor pose on the robot. 
 
mrpt::utils::CImage imageRight
Image from the right camera, only contains a valid image if hasImageRight == true. 
 
Each one of the measurements: 
 
mrpt::math::CMatrixDouble33 intrinsicParams
Matrix of intrinsic parameters (containing the focal length and principal point coordinates) ...
 
TStereoSystemParams()
Initilization of default parameters. 
 
Matching by sum of absolute differences of the image patches. 
 
double maxSAD_TH
Minimum Euclidean Distance Between Sum of Absolute Differences. 
 
void setFromMatrix(const Eigen::MatrixBase< Derived > &m, bool matrix_is_normalized=true)
Set the image from a matrix, interpreted as grayscale intensity values, in the range [0...
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
The class for storing "landmarks" (visual or laser-scan-extracted features,...) 
 
void dumpToTextStream(mrpt::utils::CStream &out) const MRPT_OVERRIDE
This method should clearly display all the contents of the structure in textual form, sending it to a CStream. 
 
void setFromImageReadOnly(const CImage &other_img)
Sets the internal IplImage pointer to that of another given image, WITHOUT making a copy...
 
mrpt::math::CArrayDouble< 5 > dist
[k1 k2 t1 t2 k3] -> k_i: parameters of radial distortion, t_i: parameters of tangential distortion (d...
 
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
 
mrpt::math::TPoint3D normal
The "normal" to the landmark, i.e. a unitary 3D vector towards the viewing direction, or a null vector if not applicable. 
 
float maxZ
Maximum allowed distance. 
 
mrpt::poses::CPose3DQuat rightCameraPose
The pose of the right camera, relative to the left one: Note that using the conventional reference co...
 
void VISION_IMPEXP computeStereoRectificationMaps(const mrpt::utils::TCamera &cam1, const mrpt::utils::TCamera &cam2, const mrpt::poses::CPose3D &rightCameraPose, void *outMap1x, void *outMap1y, void *outMap2x, void *outMap2y)
Computes a pair of x-and-y maps for stereo rectification from a pair of cameras and the relative pose...
 
size_t VISION_IMPEXP matchFeatures(const CFeatureList &list1, const CFeatureList &list2, CMatchedFeatureList &matches, const TMatchingOptions &options=TMatchingOptions(), const TStereoSystemParams ¶ms=TStereoSystemParams())
Find the matches between two lists of features which must be of the same type. 
 
This observation represents a number of range-bearing value pairs, each one for a detected landmark...
 
A structure containing options for the matching. 
 
void extract_patch(CImage &patch, const unsigned int col=0, const unsigned int row=0, const unsigned int width=1, const unsigned int height=1) const
Extract a patch from this image, saveing it into "patch" (its previous contents will be overwritten)...
 
uint32_t nrows
Camera resolution. 
 
Matching by cross correlation of the image patches. 
 
void setLeftMaxID(const TFeatureID &leftID)
Explicitly set the max IDs values to certain values. 
 
void VISION_IMPEXP generateMask(const CMatchedFeatureList &mList, mrpt::math::CMatrixBool &mask1, mrpt::math::CMatrixBool &mask2, int wSize=10)
Calculates the Sum of Absolutes Differences (range [0,1]) between two patches. 
 
bool hasFundamentalMatrix
Whether or not there is a fundamental matrix. 
 
mrpt::maps::CLandmarksMap landmarks
The landmarks, with coordinates origin in the camera reference system. 
 
size_t getColCount() const
Number of columns in the matrix. 
 
A matrix of dynamic size. 
 
size_t getRowCount() const
Number of rows in the matrix. 
 
int round(const T value)
Returns the closer integer (int) to x. 
 
TInternalFeatList::iterator iterator
 
float maxEDSD_TH
Maximum Euclidean Distance Between SURF Descriptors. 
 
float minCC_TH
Minimum Value of the Cross Correlation. 
 
float factor_a
Alpha factor for SUT. 
 
internal::TSequenceLandmarks::const_iterator const_iterator
 
float factor_b
Beta factor for the SUT. 
 
float maxEDD_TH
Maximum Euclidean Distance Between SIFT Descriptors. 
 
bool isColor() const
Returns true if the image is RGB, false if it is grayscale. 
 
dynamic_vector< double > CVectorDouble
Column vector, like Eigen::MatrixXd, but automatically initialized to zeros since construction...
 
void dumpToTextStream(mrpt::utils::CStream &out) const MRPT_OVERRIDE
This method should clearly display all the contents of the structure in textual form, sending it to a CStream. 
 
void VISION_IMPEXP deleteRepeatedFeats(CFeatureList &list)
Explore the feature list and removes features which are in the same coordinates. 
 
bool validCovariances
True: The individual 3x3 covariance matrices must be taken into account, false (default): All the mea...
 
void VISION_IMPEXP getDispersion(const CFeatureList &list, mrpt::math::CVectorFloat &std, mrpt::math::CVectorFloat &mean)
Computes the dispersion of the features in the image. 
 
TFeatureType get_type() const
The type of the first feature in the list. 
 
mrpt::math::TPoint3D pose_mean
The mean of the landmark 3D position. 
 
double distance(const TPoint2D &point) const
Distance from a given point. 
 
This class is a "CSerializable" wrapper for "CMatrixFloat". 
 
TMatchingMethod matching_method
Matching method. 
 
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) MRPT_OVERRIDE
This method load the options from a ".ini"-like file or memory-stored string list. 
 
GLubyte GLubyte GLubyte a
 
void VISION_IMPEXP normalizeImage(const mrpt::utils::CImage &image, mrpt::utils::CImage &nimage)
Normalizes the brigthness and contrast of an image by setting its mean value to zero and its standard...
 
GLenum const GLfloat * params
 
size_t getWidth() const MRPT_OVERRIDE
Returns the width of the image in pixels. 
 
mrpt::math::CMatrixDouble33 VISION_IMPEXP defaultIntrinsicParamsMatrix(unsigned int camIndex=0, unsigned int resolutionX=320, unsigned int resolutionY=240)
Returns the stored, default intrinsic params matrix for a given camera: 
 
A structure for holding correspondences between two sets of points or points-like entities in 2D or 3...
 
void getHomogeneousMatrix(mrpt::math::CMatrixDouble44 &out_HM) const
Returns the corresponding 4x4 homogeneous transformation matrix for the point(translation) or pose (t...
 
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix. 
 
mrpt::poses::CPose3DQuat rightCameraPose
Pose of the right camera with respect to the coordinate origin of the left camera. 
 
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form. 
 
struct VISION_IMPEXP mrpt::maps::CLandmarksMap::TCustomSequenceLandmarks landmarks
 
Structure to hold the parameters of a pinhole camera model. 
 
Uncertainty propagation through the Scaled Unscented Transformation. 
 
size_t getHeight() const MRPT_OVERRIDE
Returns the height of the image in pixels. 
 
float stdDisp
Standard deviation of the error in disparity computation. 
 
TLandmarkID ID
An ID for the landmark (see details next...) This ID was introduced in the version 3 of this class (2...
 
TMeasurementList sensedData
The list of observed ranges: 
 
mrpt::math::CMatrixDouble33 K
Intrinsic parameters. 
 
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1
 
2D line without bounds, represented by its equation . 
 
mrpt::math::CMatrixDouble33 VISION_IMPEXP buildIntrinsicParamsMatrix(const double focalLengthX, const double focalLengthY, const double centerX, const double centerY)
Builds the intrinsic parameters matrix A from parameters: 
 
mrpt::math::CMatrixDouble33 covariance
The covariance matrix of the landmark, with variable indices [0,1,2] being [range,yaw,pitch].