in IsometricPatternMatcher/HexGridFitting.cpp [331:375]
std::vector<int> HexGridFitting::calculateSubregionPosesAndBestIndex(
const ceres::Solver::Options& solverOption, const Sophus::Plane3d& plane,
const std::vector<Eigen::Matrix2Xd>& neighbourDots,
const Sophus::SE3d& initT_camera_target,
std::vector<Sophus::SE3d>& Ts_camera_targetForSubregions,
std::vector<std::vector<int>>& inliersIndx) {
// blocks
double maxX = imageDots_.row(0).maxCoeff();
double minX = imageDots_.row(0).minCoeff();
double maxY = imageDots_.row(1).maxCoeff();
double minY = imageDots_.row(1).minCoeff();
std::vector<double> segX;
std::vector<double> segY;
// segment X
for (int i = 0; i <= numberSegX_; i++) {
segX.push_back(minX + (maxX - minX) / numberSegX_ * i);
}
// segment Y
for (int i = 0; i <= numberSegY_; i++) {
segY.push_back(minY + (maxY - minY) / numberSegY_ * i);
}
std::vector<std::vector<int>> blockIndx(numberSegX_ * numberSegY_);
for (size_t i = 0; i < imageDots_.cols(); ++i) {
for (int x = 0; x < numberSegX_; x++) {
for (int y = 0; y < numberSegY_; y++) {
if (imageDots_(0, i) >= segX[x] && imageDots_(0, i) < segX[x + 1] &&
imageDots_(1, i) >= segY[y] && imageDots_(1, i) < segY[y + 1])
blockIndx[x * numberSegY_ + y].push_back(i);
}
}
}
std::vector<int> numberInliers;
std::vector<int> indx;
for (int i = 0; i < blockIndx.size(); ++i) {
Ts_camera_targetForSubregions.push_back(
initT_camera_target); // initialization
if (findT_camera_target(solverOption, neighbourDots, blockIndx[i], 0.2,
plane, Ts_camera_targetForSubregions[i],
inliersIndx[i])) {
numberInliers.push_back(inliersIndx[i].size());
}
}
getSortIndx(numberInliers, indx); // ascend order
return indx;
}