【问题标题】:Minimum along a dimension in a Multi Dimensional arrays C++沿多维数组C ++中的维度的最小值
【发布时间】:2015-12-11 15:28:24
【问题描述】:

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

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

我想在第 3 维的每个点上找到最小值以生成 2D 矩阵。

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

【问题讨论】:

  • openCV 针对二维矩阵(图像)进行了高度优化。
  • 如果你可以有一个vector<Mat>,每个Mat都是一个二维矩阵,那么它会容易得多。

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


【解决方案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&lt;Mat&gt; 代替(其中向量中的每个 Mat 都是 2d)。

这与上面的代码相同,使用vector&lt;Mat&gt;

#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&lt;float&gt;(row, col);

【讨论】:

  • 感谢 Miki 提供代码。我开始知道如何使用范围数据类型......它非常有帮助。我也会尝试使用 vector,因为 Opencv 在这个意义上更优化。
  • @user2527599 不客气。如果您觉得它有用,请接受作为答案(并最终投票)
  • @user2527599 如果您需要矢量示例 告诉我
  • for vector images(10)....我们可以使用 images.at(i) 访问每个图像,但是如何在矢量中的每个元素内访问 i....意思是如何访问该向量的矩阵中的像素.. 似乎 images.at(1)[10,10] .. 不工作.. 向量中像素访问的任何线索 ?跨度>
  • 是的..请提供该向量示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2013-10-17
  • 2017-12-25
  • 2021-09-05
相关资源
最近更新 更多