沿着多维数组C ++中的维度的最小值

时间:2015-09-15 11:32:44

标签: c++ opencv pointers matrix multidimensional-array

我有一个大小为(100,100,50)的3D矩阵。

 int sizes[]={100,100,50};
 Mat data_3d(3,sizes, CV_32FC1, cv::Scalar(0));

我希望在第3维的每个点找到最小值以产生2D矩阵。

OpenCv仅支持2D矩阵的min,max查找。请帮我知道是否有针对第n维的最小值,最大值的就绪函数。

1 个答案:

答案 0 :(得分:1)

您可以沿z维度切割3D垫片,并使用cv::min比较切片。

代码:

#include <opencv2\opencv.hpp>
using namespace cv;

int main() 
{
    int sizes[] = {10, 7, 5};
    Mat data(3, sizes, CV_32F);

    // Init data with each plane a constant increasing value
    for (int z = 0; z < data.size[2]; ++z)
    {
        Range ranges[] = { Range::all(), Range::all(), Range(z, z + 1) };
        data(ranges) = data.size[2] - z;
    }


    // Compute minimum along 3rd dimension
    Mat minmat(data.size[0], data.size[1], data.type(), Scalar(DBL_MAX));

    for (int z = 0; z < data.size[2]; ++z)
    {
        Range ranges[] = { Range::all(), Range::all(), Range(z, z+1) };
        Mat slice(data(ranges).clone()); // with clone slice is continuous, but still 3d
        Mat slice2d(2, &data.size[0], data.type(), slice.data);

        cv::min(slice2d, minmat, minmat);
    }

    // minmat is a 10x7 mat containing in (y,x) the minimum value along z

    return 0;
}

由于OpenCV更适合2d矩阵,因此您应该考虑使用vector<Mat>代替(向量中的每个Mat都是2d)。

这与上面的代码相同,使用vector<Mat>

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    int size_h = 10;
    int size_w = 7;
    int size_z = 5;

    vector<Mat> data(size_z);   
    // Init data with each plane a constant increasing value
    for (int z = 0; z < size_z; ++z)
    {
        data[z] = Mat(size_h, size_w, CV_32F, Scalar(size_z - z));
    }

    // Compute minimum along 3rd dimension
    Mat minmat(size_h, size_w, CV_32F, Scalar(DBL_MAX));

    for (int z = 0; z < size_z; ++z)
    {
        cv::min(data[z], minmat, minmat);
    }

    // minmat is a 10x7 mat containing in (y,x) the minimum value along z

    return 0;
}

要访问您执行的每个矩阵:data[index],要访问给定行和列的像素,请执行以下操作:data[index].at<float>(row, col);