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

标签 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 维的每个点的最小值以生成二维矩阵。

OpenCv 仅支持 2D 矩阵的最小值、最大值查找。请帮助我知道是否有用于第 n 维的最小值、最大值的现成函数。

最佳答案

您可以沿 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 更适合二维矩阵,您应该考虑使用 vector<Mat>相反( vector 中的每个 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) ;

关于c++ - 多维数组C++中沿维度的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584960/

相关文章:

C++ OpenCV 使用 vector<Point> 作为矩阵的索引

c++ - OpenCV - TranCascade 错误 (bad_alloc)

C++ 应用程序执行时间

C++ 使用 std::list of pointers 重新排序 std::vector 元素

c++ - 使用 opencv 匹配一组图像中的图像,以便在 C++ 中进行识别

c++ - 我们如何找出地址和值来自数组中的哪个元素在C++中

c++ - 使用从成员函数返回的数组,可以吗?

c++ - 可移植标记指针

c++ - 带有新 SIGNAL 的 QEditLine 的子类

c++ - 抛出异常错误 'terminate called...'