在 OpenCV 中计算 3D 梯度方向
Compute 3D gradient directions in OpenCV
我有一个 160x120
OpenCV Mat,其中我在每个位置存储了一个 Vec3F
向量。 Vec3f
包含特定像素的 (x, y, z)
信息,该信息已使用强度图像和相应的深度图通过 3D 重建计算得出。
所以我基本上从 Mat
在每个像素处保存灰度值映射到 Mat
在每个像素处保存 3D 位置信息。
然后我尝试计算 Mat
对象中每个像素的梯度。因此,我在 C++/OpenCV 中实现了这段代码:
for(int x = 0; x < mat.rows; ++x){
for(int y = 0; y < mat.cols; ++y){
float Gx = (mat.at<Vec3f>(x+1, y)[0] - mat.at<Vec3f>(x-1, y)[0]) / 2.0;
float Gy = (depth.at<Vec3f>(x, y+1)[1] - depth.at<Vec3f>(x, y-1)[1]) / 2.0;
Vec3f d = (Gx, Gy, 1.0);
Vec3f n = normalize(d);
allGradients.push_back(n);
}
}
// mat.at<Vec3f>(x, y)[0] -> Get the Vec3F vector at the current x-, y-
// position in the Mat and access its first element (which is the points x-value).
所以我用有限差分近似的方法计算了梯度方向Gx
和Gy
。
我不明白的是如何计算z方向的梯度。我确实有存储在 Vec3f
中的每个像素的 z 信息以及 x 和 y 信息,但是有限差分近似步骤是不可能的,因为数据存储在 2D Mat
, 正确的?
所以我不能通过做类似这样的事情来简单地访问当前像素前后的像素:
float Gz = (mat.at<Vec3f>(x, y, z+1)[2] - mat.at<Vec3f>(x, y, z-1)[2]) / 2.0;
如 Mat
我没有 z 值,对吗?如果是这样,我该如何计算 z 方向的梯度?我需要将我的信息存储在 3D array
中吗?还是整个方法不正确?谢谢!
看起来你拥有的是一个 3 维对象,你以某种方式将其强制转换为 2D 矩阵。如果你真的有一个 3D 体积对象,你可以使用下面的 Opencv Mat
构造函数
Mat::Mat(int ndims, const int* sizes, int type)
在此处查看文档:http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-mat
此构造函数允许您创建 n 维 Mat
对象。示例:
cv::Mat m = cv::Mat(3, {100, 100, 10}, CV_32SC1)
如果您的输入是一个二维空间对象,每个像素都附有一些 3 维场,那么当然,沿 z 方向的 spatial gradient
是 0,但我猜您的输入是完整的体积对象?
我有一个 160x120
OpenCV Mat,其中我在每个位置存储了一个 Vec3F
向量。 Vec3f
包含特定像素的 (x, y, z)
信息,该信息已使用强度图像和相应的深度图通过 3D 重建计算得出。
所以我基本上从 Mat
在每个像素处保存灰度值映射到 Mat
在每个像素处保存 3D 位置信息。
然后我尝试计算 Mat
对象中每个像素的梯度。因此,我在 C++/OpenCV 中实现了这段代码:
for(int x = 0; x < mat.rows; ++x){
for(int y = 0; y < mat.cols; ++y){
float Gx = (mat.at<Vec3f>(x+1, y)[0] - mat.at<Vec3f>(x-1, y)[0]) / 2.0;
float Gy = (depth.at<Vec3f>(x, y+1)[1] - depth.at<Vec3f>(x, y-1)[1]) / 2.0;
Vec3f d = (Gx, Gy, 1.0);
Vec3f n = normalize(d);
allGradients.push_back(n);
}
}
// mat.at<Vec3f>(x, y)[0] -> Get the Vec3F vector at the current x-, y-
// position in the Mat and access its first element (which is the points x-value).
所以我用有限差分近似的方法计算了梯度方向Gx
和Gy
。
我不明白的是如何计算z方向的梯度。我确实有存储在 Vec3f
中的每个像素的 z 信息以及 x 和 y 信息,但是有限差分近似步骤是不可能的,因为数据存储在 2D Mat
, 正确的?
所以我不能通过做类似这样的事情来简单地访问当前像素前后的像素:
float Gz = (mat.at<Vec3f>(x, y, z+1)[2] - mat.at<Vec3f>(x, y, z-1)[2]) / 2.0;
如 Mat
我没有 z 值,对吗?如果是这样,我该如何计算 z 方向的梯度?我需要将我的信息存储在 3D array
中吗?还是整个方法不正确?谢谢!
看起来你拥有的是一个 3 维对象,你以某种方式将其强制转换为 2D 矩阵。如果你真的有一个 3D 体积对象,你可以使用下面的 Opencv Mat
构造函数
Mat::Mat(int ndims, const int* sizes, int type)
在此处查看文档:http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-mat
此构造函数允许您创建 n 维 Mat
对象。示例:
cv::Mat m = cv::Mat(3, {100, 100, 10}, CV_32SC1)
如果您的输入是一个二维空间对象,每个像素都附有一些 3 维场,那么当然,沿 z 方向的 spatial gradient
是 0,但我猜您的输入是完整的体积对象?