/** * This file is part of DSO. * * Copyright 2016 Technical University of Munich and Intel. * Developed by Jakob Engel , * for more information see . * If you use this code, please cite the respective publications as * listed on the above website. * * DSO is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DSO is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with DSO. If not, see . */ #pragma once #include "util/NumType.h" namespace dso { const float minUseGrad_pixsel = 10; template inline int gridMaxSelection(Eigen::Vector3f* grads, bool* map_out, int w, int h, float THFac) { memset(map_out, 0, sizeof(bool)*w*h); int numGood = 0; for(int y=1;y().squaredNorm(); float TH = THFac*minUseGrad_pixsel * (0.75f); if(sqgd > TH*TH) { float agx = fabs((float)g[1]); if(agx > bestXX) {bestXX=agx; bestXXID=idx;} float agy = fabs((float)g[2]); if(agy > bestYY) {bestYY=agy; bestYYID=idx;} float gxpy = fabs((float)(g[1]-g[2])); if(gxpy > bestXY) {bestXY=gxpy; bestXYID=idx;} float gxmy = fabs((float)(g[1]+g[2])); if(gxmy > bestYX) {bestYX=gxmy; bestYXID=idx;} } } bool* map0 = map_out+x+y*w; if(bestXXID>=0) { if(!map0[bestXXID]) numGood++; map0[bestXXID] = true; } if(bestYYID>=0) { if(!map0[bestYYID]) numGood++; map0[bestYYID] = true; } if(bestXYID>=0) { if(!map0[bestXYID]) numGood++; map0[bestXYID] = true; } if(bestYXID>=0) { if(!map0[bestYXID]) numGood++; map0[bestYXID] = true; } } } return numGood; } inline int gridMaxSelection(Eigen::Vector3f* grads, bool* map_out, int w, int h, int pot, float THFac) { memset(map_out, 0, sizeof(bool)*w*h); int numGood = 0; for(int y=1;y().squaredNorm(); float TH = THFac*minUseGrad_pixsel * (0.75f); if(sqgd > TH*TH) { float agx = fabs((float)g[1]); if(agx > bestXX) {bestXX=agx; bestXXID=idx;} float agy = fabs((float)g[2]); if(agy > bestYY) {bestYY=agy; bestYYID=idx;} float gxpy = fabs((float)(g[1]-g[2])); if(gxpy > bestXY) {bestXY=gxpy; bestXYID=idx;} float gxmy = fabs((float)(g[1]+g[2])); if(gxmy > bestYX) {bestYX=gxmy; bestYXID=idx;} } } bool* map0 = map_out+x+y*w; if(bestXXID>=0) { if(!map0[bestXXID]) numGood++; map0[bestXXID] = true; } if(bestYYID>=0) { if(!map0[bestYYID]) numGood++; map0[bestYYID] = true; } if(bestXYID>=0) { if(!map0[bestXYID]) numGood++; map0[bestXYID] = true; } if(bestYXID>=0) { if(!map0[bestYXID]) numGood++; map0[bestYXID] = true; } } } return numGood; } inline int makePixelStatus(Eigen::Vector3f* grads, bool* map, int w, int h, float desiredDensity, int recsLeft=5, float THFac = 1) { if(sparsityFactor < 1) sparsityFactor = 1; int numGoodPoints; if(sparsityFactor==1) numGoodPoints = gridMaxSelection<1>(grads, map, w, h, THFac); else if(sparsityFactor==2) numGoodPoints = gridMaxSelection<2>(grads, map, w, h, THFac); else if(sparsityFactor==3) numGoodPoints = gridMaxSelection<3>(grads, map, w, h, THFac); else if(sparsityFactor==4) numGoodPoints = gridMaxSelection<4>(grads, map, w, h, THFac); else if(sparsityFactor==5) numGoodPoints = gridMaxSelection<5>(grads, map, w, h, THFac); else if(sparsityFactor==6) numGoodPoints = gridMaxSelection<6>(grads, map, w, h, THFac); else if(sparsityFactor==7) numGoodPoints = gridMaxSelection<7>(grads, map, w, h, THFac); else if(sparsityFactor==8) numGoodPoints = gridMaxSelection<8>(grads, map, w, h, THFac); else if(sparsityFactor==9) numGoodPoints = gridMaxSelection<9>(grads, map, w, h, THFac); else if(sparsityFactor==10) numGoodPoints = gridMaxSelection<10>(grads, map, w, h, THFac); else if(sparsityFactor==11) numGoodPoints = gridMaxSelection<11>(grads, map, w, h, THFac); else numGoodPoints = gridMaxSelection(grads, map, w, h, sparsityFactor, THFac); /* * #points is approximately proportional to sparsityFactor^2. */ float quotia = numGoodPoints / (float)(desiredDensity); int newSparsity = (sparsityFactor * sqrtf(quotia))+0.7f; if(newSparsity < 1) newSparsity=1; float oldTHFac = THFac; if(newSparsity==1 && sparsityFactor==1) THFac = 0.5; if((abs(newSparsity-sparsityFactor) < 1 && THFac==oldTHFac) || ( quotia > 0.8 && 1.0f / quotia > 0.8) || recsLeft == 0) { // printf(" \n"); //all good sparsityFactor = newSparsity; return numGoodPoints; } else { // printf(" -> re-evaluate! \n"); // re-evaluate. sparsityFactor = newSparsity; return makePixelStatus(grads, map, w,h, desiredDensity, recsLeft-1, THFac); } } }