7、 进行深度图像的 区域生长 处理,将动态区域生成一个掩码
cv::Mat Geometry::DepthRegionGrowing(const vector<DynKeyPoint> &vDynPoints, const cv::Mat &imDepth){ cv::Mat maskG = cv::Mat::zeros(480, 640, CV_32F); if (!vDynPoints.empty()) { mSegThreshold = 0.20; for (size_t i(0); i < vDynPoints.size(); i++) { int xSeed = vDynPoints[i].mPoint.x; int ySeed = vDynPoints[i].mPoint.y; const float d = imDepth.at<float>(ySeed, xSeed); if (maskG.at<float>(ySeed, xSeed) != 1. && d > 0) { cv::Mat J = RegionGrowing(imDepth, xSeed, ySeed, mSegThreshold); maskG = maskG | J; } } int dilation_size = 15; cv::Mat kernel = getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2 * dilation_size + 1, 2 * dilation_size + 1), cv::Point(dilation_size, dilation_size)); maskG.cv::Mat::convertTo(maskG, CV_8U); cv::dilate(maskG, maskG, kernel); } else { maskG.cv::Mat::convertTo(maskG, CV_8U); } cv::Mat _maskG = cv::Mat::ones(480, 640, CV_8U); maskG = _maskG - maskG; return maskG;}该 函数 的目的是进行深度图像的区域生长处理,以根据给定的动态关键点(vDynPoints)和深度图像(imDepth)生成一个掩码(maskG),表示动态物体在图像中的区域。
函数的具体步骤如下:
8、目的是将两个遮罩(mask)图像进行合并
void Geometry::CombineMasks(const ORB_SLAM2::Frame ¤tFrame, cv::Mat &mask) { cv::Mat _maskL = cv::Mat::ones(currentFrame.mImMask.size(), currentFrame.mImMask.type()); _maskL = _maskL - currentFrame.mImMask; cv::Mat _maskG = cv::Mat::ones(mask.size(), mask.type()); _maskG = _maskG - mask; cv::Mat _mask = _maskL | _maskG; cv::Mat __mask = cv::Mat::ones(_mask.size(), _mask.type()); __mask = __mask - _mask; mask = __mask; }以下是 代码 的解释:
currentFrame.mImMask图像大小相同的cv::Mat对象 _maskL,并将其初始化为全1(白色)的图像。currentFrame.mImMask图像,将该图像中的前景区域(非零像素)置为0,背景区域(零像素)保持为1。结果存储在 _maskL 中。