for (int j(0); j < p; j++)
{
int _x = (int)vPixels.at<float>(j, 0);
int _y = (int)vPixels.at<float>(j, 1);
float x = vProjPixels.at<float>(j, 0); // x of *
float y = vProjPixels.at<float>(j, 1); // y of *
/*
-----------
| A | B |
----*------ y
| C | D |
-----------
x
*/
float x_a = floor(x);
float y_a = floor(y);
float x_b = ceil(x);
float y_b = floor(y);
float x_c = floor(x);
float y_c = ceil(y);
float x_d = ceil(x);
float y_d = ceil(y);
float weight = 0;
定义一些权值
if (IsInImage(x_a, y_a, imGrayAccumulator))
{
if (abs(imMinDepth.at<float>(y_a, x_a) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD)
{
weight = Area(x, x_a, y, y_a);
imCounter.at<float>(int(y_a), int(x_a)) += weight;
imGrayAccumulator.at<float>(int(y_a), int(x_a)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_a), int(x_a)) += weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_a), int(x_a)) = 1;
}
else if ((imMinDepth.at<float>(y_a, x_a) - matProjDepth.at<float>(j, 0)) > 0)
{
weight = Area(x, x_a, y, y_a);
imCounter.at<float>(int(y_a), int(x_a)) = weight;
imGrayAccumulator.at<float>(int(y_a), int(x_a)) = weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_a), int(x_a)) = weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_a), int(x_a)) = 1;
}
imMinDepth.at<float>(y_a, x_a) = min(imMinDepth.at<float>(y_a, x_a), matProjDepth.at<float>(j, 0));
}
这段代码是根据条件对不同的像素进行处理和更新。让我解释一下每个部分的含义:
-
IsInImage(x_a, y_a, imGrayAccumulator)
: 这是一个条件判断函数,用于检查坐标(x_a, y_a)
是否在目标图像的范围内。如果在图像范围内,则执行下面的代码段。 -
abs(imMinDepth.at<float>(y_a, x_a) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD
: 这是一个条件判断语句,检查imMinDepth
图像在坐标(y_a, x_a)
处的深度值与matProjDepth
的第j
行第一列元素的差的绝对值是否小于MIN_DEPTH_THRESHOLD
。如果满足条件,则执行相应的代码块。 -
weight = Area(x, x_a, y, y_a)
: 这个语句计算权重值,根据目标像素(x, y)
与像素点 A 的相对位置(x_a, y_a)
,使用某种计算公式来确定权重值。 -
imCounter.at<float>(int(y_a), int(x_a)) += weight
: 这行代码将权重值加到imCounter
图像的坐标(int(y_a), int(x_a))
处的像素值上。 -
imGrayAccumulator.at<float>(int(y_a), int(x_a)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x)
: 这行代码将权重值乘以参考帧refFrame
的灰度图像在坐标(_y, _x)
处的像素值,并加到imGrayAccumulator
图像的坐标(int(y_a), int(x_a))
处的像素值上。 -
imDepthAccumulator.at<float>(int(y_a), int(x_a)) += weight * matProjDepth.at<float>(j, 0)
: 这行代码将权重值乘以matProjDepth
的第j
行第一列元素的值,并加到imDepthAccumulator
图像的坐标(int(y_a), int(x_a))
处的像素值上。 -
mask.at<uchar>(int(y_a), int(x_a)) = 1
: 这行代码将mask
图像在坐标(int(y_a), int(x_a))
处的像素值设置为 1,表示此像素处于有效区域。 -
imMinDepth.at<float>(y_a, x_a) = min(imMinDepth.at<float>(y_a, x_a), matProjDepth.at<float>(j, 0))
: 这行代码比较imMinDepth
图像在坐标(y_a, x_a)
处的深度值和matProjDepth
的第j
行第一列元素的值,并将较小的值更新到imMinDepth
图像的相应位置上。
总体来说,这段代码通过计算权重值并根据一些条件来更新不同图像和变量的值,可能涉及到图像深度处理、像素累积计算和掩码操作等
if (IsInImage(x_b, y_b, imGrayAccumulator) && (x_a != x_b))
{
if (abs(imMinDepth.at<float>(y_b, x_b) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD)
{
weight = Area(x, x_b, y, y_b);
imCounter.at<float>(int(y_b), int(x_b)) += weight;
imGrayAccumulator.at<float>(int(y_b), int(x_b)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_b), int(x_b)) += weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_b), int(x_b)) = 1;
}
else if ((imMinDepth.at<float>(y_b, x_b) - matProjDepth.at<float>(j, 0)) > 0)
{
weight = Area(x, x_b, y, y_b);
imCounter.at<float>(int(y_b), int(x_b)) = weight;
imGrayAccumulator.at<float>(int(y_b), int(x_b)) = weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_b), int(x_b)) = weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_b), int(x_b)) = 1;
}
imMinDepth.at<float>(y_b, x_b) = min(imMinDepth.at<float>(y_b, x_b), matProjDepth.at<float>(j, 0));
}
这段代码与上一段代码类似,是根据条件对不同的像素进行处理和更新。让我解释一下每个部分的含义:
-
IsInImage(x_b, y_b, imGrayAccumulator)
: 这是一个条件判断函数,用于检查坐标(x_b, y_b)
是否在目标图像的范围内。如果在图像范围内,则执行下面的代码段。 -
(x_a != x_b)
: 这是一个条件判断语句,检查x_a
是否不等于x_b
。如果两者不相等,则执行下面的代码段。 -
abs(imMinDepth.at<float>(y_b, x_b) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD
: 这是一个条件判断语句,检查imMinDepth
图像在坐标(y_b, x_b)
处的深度值与matProjDepth
的第j
行第一列元素的差的绝对值是否小于MIN_DEPTH_THRESHOLD
。如果满足条件,则执行相应的代码块。 -
weight = Area(x, x_b, y, y_b)
: 这个语句计算权重值,根据目标像素(x, y)
与像素点 B 的相对位置(x_b, y_b)
,使用某种计算公式来确定权重值。 -
imCounter.at<float>(int(y_b), int(x_b)) += weight
: 这行代码将权重值加到imCounter
图像的坐标(int(y_b), int(x_b))
处的像素值上。 -
imGrayAccumulator.at<float>(int(y_b), int(x_b)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x)
: 这行代码将权重值乘以参考帧refFrame
的灰度图像在坐标(_y, _x)
处的像素值,并加到imGrayAccumulator
图像的坐标(int(y_b), int(x_b))
处的像素值上。 -
imDepthAccumulator.at<float>(int(y_b), int(x_b)) += weight * matProjDepth.at<float>(j, 0)
: 这行代码将权重值乘以matProjDepth
的第j
行第一列元素的值,并加到imDepthAccumulator
图像的坐标(int(y_b), int(x_b))
处的像素值上。 -
mask.at<uchar>(int(y_b), int(x_b)) = 1
: 这行代码将mask
图像在坐标(int(y_b), int(x_b))
处的像素值设置为 1,表示此像素处于有效区域。 -
imMinDepth.at<float>(y_b, x_b) = min(imMinDepth.at<float>(y_b, x_b), matProjDepth.at<float>(j, 0))
: 这行代码比较imMinDepth
图像在坐标(y_b, x_b)
处的深度值和matProjDepth
的第j
行第一列元素的值,并将较小的值更新到imMinDepth
图像的相应位置上。
这段代码的作用是根据条件将权重值和一些变量更新到不同的图像和变量中。
if (IsInImage(x_c, y_c, imGrayAccumulator) && (y_a != y_c) && (x_b != x_c && y_b != y_c))
{
if (abs(imMinDepth.at<float>(y_c, x_c) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD)
{
weight = Area(x, x_c, y, y_c);
imCounter.at<float>(int(y_c), int(x_c)) += weight;
imGrayAccumulator.at<float>(int(y_c), int(x_c)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_c), int(x_c)) += weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_c), int(x_c)) = 1;
}
else if ((imMinDepth.at<float>(y_c, x_c) - matProjDepth.at<float>(j, 0)) > 0)
{
weight = Area(x, x_c, y, y_c);
imCounter.at<float>(int(y_c), int(x_c)) = weight;
imGrayAccumulator.at<float>(int(y_c), int(x_c)) = weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_c), int(x_c)) = weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_c), int(x_c)) = 1;
}
imMinDepth.at<float>(y_c, x_c) = min(imMinDepth.at<float>(y_c, x_c), matProjDepth.at<float>(j, 0));
}
这段代码与前面类似,在特定的条件下对像素进行处理和更新。让我逐步解释每个部分的含义:
-
IsInImage(x_c, y_c, imGrayAccumulator)
: 这是一个条件判断函数,用于检查坐标(x_c, y_c)
是否在目标图像的范围内。 -
(y_a != y_c) && (x_b != x_c && y_b != y_c)
: 这是一个条件判断语句,同时检查y_a
是否不等于y_c
,以及x_b
和y_b
是否都不等于x_c
和y_c
。如果这些条件都满足,则执行下面的代码。 -
abs(imMinDepth.at<float>(y_c, x_c) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD
: 这是一个条件判断语句,检查imMinDepth
图像在坐标(y_c, x_c)
处的深度值与matProjDepth
的第j
行第一列元素的差的绝对值是否小于MIN_DEPTH_THRESHOLD
。如果满足条件,则执行相应的代码块。 -
weight = Area(x, x_c, y, y_c)
: 这个语句计算权重值,根据目标像素(x, y)
与像素点 C 的相对位置(x_c, y_c)
,使用某种计算公式来确定权重值。 -
imCounter.at<float>(int(y_c), int(x_c)) += weight
: 这行代码将权重值加到imCounter
图像的坐标(int(y_c), int(x_c))
处的像素值上。 -
imGrayAccumulator.at<float>(int(y_c), int(x_c)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x)
: 这行代码将权重值乘以参考帧refFrame
的灰度图像在坐标(_y, _x)
处的像素值,并加到imGrayAccumulator
图像的坐标(int(y_c), int(x_c))
处的像素值上。 -
imDepthAccumulator.at<float>(int(y_c), int(x_c)) += weight * matProjDepth.at<float>(j, 0)
: 这行代码将权重值乘以matProjDepth
的第j
行第一列元素的值,并加到imDepthAccumulator
图像的坐标(int(y_c), int(x_c))
处的像素值上。 -
mask.at<uchar>(int(y_c), int(x_c)) = 1
: 这行代码将mask
图像在坐标(int(y_c), int(x_c))
处的像素值设置为 1,表示此像素处于有效区域。 -
imMinDepth.at<float>(y_c, x_c) = min(imMinDepth.at<float>(y_c, x_c), matProjDepth.at<float>(j, 0))
: 这行代码比较imMinDepth
图像在坐标(y_c, x_c)
处的深度值和matProjDepth
的第j
行第一列元素的值,并将较小的值更新到imMinDepth
图像的相应位置上。
这段代码的作用是根据一系列条件对像素进行处理和更新,将权重值和一些变量更新到不同的图像和变量中。
if (IsInImage(x_d, y_d, imGrayAccumulator) && (x_a != x_d && y_a != y_d) && (y_b != y_d) && (x_d != x_c))
{
if (abs(imMinDepth.at<float>(y_d, x_d) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD)
{
weight = Area(x, x_d, y, y_d);
imCounter.at<float>(int(y_d), int(x_d)) += weight;
imGrayAccumulator.at<float>(int(y_d), int(x_d)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_d), int(x_d)) += weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_d), int(x_d)) = 1;
}
else if ((imMinDepth.at<float>(y_d, x_d) - matProjDepth.at<float>(j, 0)) > 0)
{
weight = Area(x, x_d, y, y_d);
imCounter.at<float>(int(y_d), int(x_d)) = weight;
imGrayAccumulator.at<float>(int(y_d), int(x_d)) = weight * (float)refFrame.mImGray.at<uchar>(_y, _x);
imDepthAccumulator.at<float>(int(y_d), int(x_d)) = weight * matProjDepth.at<float>(j, 0);
mask.at<uchar>(int(y_d), int(x_d)) = 1;
}
imMinDepth.at<float>(y_d, x_d) = min(imMinDepth.at<float>(y_d, x_d), matProjDepth.at<float>(j, 0));
}
这段代码与前面的代码类似,也是在特定条件下对像素进行处理和更新。让我逐步解释每个部分的含义:
-
IsInImage(x_d, y_d, imGrayAccumulator)
: 这是一个条件判断函数,用于检查坐标(x_d, y_d)
是否在目标图像的范围内。 -
(x_a != x_d && y_a != y_d) && (y_b != y_d) && (x_d != x_c)
: 这是一个条件判断语句,同时检查x_a
和y_a
是否都不等于x_d
和y_d
,且y_b
不能等于y_d
,还不能等于x_d
和x_c
。如果这些条件都满足,则执行下面的代码。 -
abs(imMinDepth.at<float>(y_d, x_d) - matProjDepth.at<float>(j, 0)) < MIN_DEPTH_THRESHOLD
: 这是一个条件判断语句,检查imMinDepth
图像在坐标(y_d, x_d)
处的深度值与matProjDepth
的第j
行第一列元素的差的绝对值是否小于MIN_DEPTH_THRESHOLD
。如果满足条件,则执行相应的代码块。 -
weight = Area(x, x_d, y, y_d)
: 这个语句计算权重值,根据目标像素(x, y)
与像素点 D 的相对位置(x_d, y_d)
,使用某种计算公式来确定权重值。 -
imCounter.at<float>(int(y_d), int(x_d)) += weight
: 这行代码将权重值加到imCounter
图像的坐标(int(y_d), int(x_d))
处的像素值上。 -
imGrayAccumulator.at<float>(int(y_d), int(x_d)) += weight * (float)refFrame.mImGray.at<uchar>(_y, _x)
: 这行代码将权重值乘以参考帧refFrame
的灰度图像在坐标(_y, _x)
处的像素值,并加到imGrayAccumulator
图像的坐标(int(y_d), int(x_d))
处的像素值上。 -
imDepthAccumulator.at<float>(int(y_d), int(x_d)) += weight * matProjDepth.at<float>(j, 0)
: 这行代码将权重值乘以matProjDepth
的第j
行第一列元素的值,并加到imDepthAccumulator
图像的坐标(int(y_d), int(x_d))
处的像素值上。 -
mask.at<uchar>(int(y_d), int(x_d)) = 1
: 这行代码将mask
图像在坐标(int(y_d), int(x_d))
处的像素值设置为 1,表示此像素处于有效区域。 -
imMinDepth.at<float>(y_d, x_d) = min(imMinDepth.at<float>(y_d, x_d), matProjDepth.at<float>(j, 0))
: 这行代码比较imMinDepth
图像在坐标(y_d, x_d)
处的深度值和matProjDepth
的第j
行第一列元素的值,并将较小的值更新到imMinDepth
图像的相应位置上。
这段代码的作用是根据一系列条件对像素进行处理和更新,将权重值和一些变量更新到不同的图像和变量中。
imGrayAccumulator = imGrayAccumulator.mul(1 / imCounter);
imDepthAccumulator = imDepthAccumulator.mul(1 / imCounter);
imGrayAccumulator.convertTo(imGrayAccumulator, CV_8U);
imGray = imGray * 0;
imGrayAccumulator.copyTo(imGray, mask);
imDepth = imDepth * 0;
imDepthAccumulator.copyTo(imDepth, mask);
这段代码是对图像进行计算和复制操作的一部分。让我逐步解释每个部分的含义:
-
imGrayAccumulator = imGrayAccumulator.mul(1 / imCounter)
: 这行代码将imGrayAccumulator
图像中的每个像素值与imCounter
图像对应位置的像素值做除法运算。这相当于将imGrayAccumulator
中的每个像素值除以imCounter
中对应位置的像素值。 -
imDepthAccumulator = imDepthAccumulator.mul(1 / imCounter)
: 这行代码将imDepthAccumulator
图像中的每个像素值与imCounter
图像对应位置的像素值做除法运算。这相当于将imDepthAccumulator
中的每个像素值除以imCounter
中对应位置的像素值。 -
imGrayAccumulator.convertTo(imGrayAccumulator, CV_8U)
: 这行代码将imGrayAccumulator
图像的数据类型转换为 8 位无符号整数型(CV_8U)。这可能是为了将图像的像素值转换为合适的范围或准备后续的操作。 -
imGray = imGray * 0
: 这行代码将imGray
图像中的所有像素值乘以 0,相当于将所有像素值设置为 0。这可能是为了清空图像。 -
imGrayAccumulator.copyTo(imGray, mask)
: 这行代码将imGrayAccumulator
图像中的非零像素值复制到imGray
图像对应位置,并且只复制mask
图像中对应位置为非零的像素值。这可能是为了将计算得到的累加结果imGrayAccumulator
应用到imGray
图像上。 -
imDepth = imDepth * 0
: 这行代码将imDepth
图像中的所有像素值乘以 0,相当于将所有像素值设置为 0。这可能是为了清空图像。 -
imDepthAccumulator.copyTo(imDepth, mask)
: 这行代码将imDepthAccumulator
图像中的非零像素值复制到imDepth
图像对应位置,并且只复制mask
图像中对应位置为非零的像素值。这可能是为了将计算得到的累加结果imDepthAccumulator
应用到imDepth
图像上。
总体来说,这段代码的作用是通过除以 imCounter
图像中的像素值,将累加器图像中的值归一化。然后,将归一化后的结果复制到对应的目标图像 imGray
和 imDepth
上,同时只复制 mask
中对应位置为非零的像素值。这可能是为了根据某种条件选择性地更新目标图像中的像素值,并清空累加器图像以备下一轮计算使用。