在OpenCV中计算3D渐变方向

时间:2016-08-19 15:23:24

标签: c++ opencv image-processing gradient

我有一个160x120 OpenCV Mat,我在每个位置都存储了一个Vec3F向量。 Vec3f保存已使用强度图像和相应深度图通过3D重建计算的特定像素的(x, y, z)信息。 所以我基本上从每个像素保持灰度值的Mat映射到每个像素保持3D位置信息的Mat

然后我尝试计算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). 

所以我用有限差分近似法计算了梯度方向GxGy

我不明白的是如何计算z方向的渐变。我确实存在Vec3f中存储的每个像素的z-信息以及x-和y-信息,但是有限差分近似的步骤是不可能的,因为数据存储在{{1}中}, 对?

所以我不能简单地通过做类似这样的事情来访问当前和之后的像素:

2D Mat

float Gz = (mat.at<Vec3f>(x, y, z+1)[2] - mat.at<Vec3f>(x, y, z-1)[2]) / 2.0; 中我没有z值,对吗?如果是这样,我怎样才能计算z方向的梯度?我需要将信息存储在Mat中吗?或者整个方法是不正确的?谢谢!

1 个答案:

答案 0 :(得分:1)

看起来你所拥有的是一个三维物体,你以某种方式强迫进入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)

如果你的输入是一个二维空间物体,每个像素都附有一些三维场,那么当然,沿z方向的spatial gradient是0,但我猜你的输入是一个完整的体积对象?