我正在尝试按照original paper中的描述实现KinectFusion算法。我已经到了他们计算深度图金字塔的部分,基本上是一堆以不同分辨率采样的深度图。这就是我的问题所在
通过块平均从D1计算子采样版本D1 + 1 然后再采样到分辨率的一半。 使用深度值 只有当它们在中心像素的3σr范围内时才能达到平均值 确保在深度边界上不会发生平滑
(强调我的)
我希望我的实现能够实时运行,所以我不想抛出嵌套的for循环,但是我没有看到任何其他方法来排除超出阈值的深度值。
我已经调查了
boxFilter
,filter2D
和blur
,其中没有一个似乎有一个可以根据阈值排除像素的参数
这似乎是均值和中值滤波之间的折衷,但在您说双边之前,我希望尽可能贴近原始实现。作者知道双边过滤是什么,并在前一节中使用它,所以他们清楚地知道它并且如果他们愿意可以使用它。我可能会用替代双边过滤进行未来的实验,但这不是我正在寻找的解决方案。
是否有任何有助于高效执行此操作的功能?或者我是否需要使用嵌套for循环?
这是我目前的for-loop实现
cv::Mat pyramid(cv::Mat& imgMat){
cv::Mat aveMat(imgMat); // Make a copy of my image for storing the averages
for(int row = 0; row < aveMat.rows; row++){
for(int col=0; col <aveMat.cols; col++){
//Select the block around the current pixel including edge cases
int startY = row-1;
if(row == 0)
startY = row;
int endY = row +1;
if(row + 1 == aveMat.rows)
endY = row;
int startX = col-1;
if(col == 0)
startX = col;
int endX = col+1;
if(col + 1 == aveMat.cols)
endX = col;
cv::Mat block = imgMat(cv::Range(startY, endY), cv::Range(startX, endX));
float curVal = imgMat.at<float>(row, col);
//Use the mean function with a mask to select values meeting the threshold
cv::Scalar meanVal = cv::mean(block, block<(curVal+SIGMA)&block>(curVal-SIGMA));
aveMat.at<float>(row,col)=meanVal[0];
}
}
//Subsample averaged image at half resolution
cv::Mat outMat;
cv::resize(aveMat, outMat, cv::Size(), 0.5, 0.5, cv::INTER_NEAREST);
return outMat;
}