沿着多维数组C ++中的维度的最小值 [英] Minimum along a dimension in a Multi Dimensional arrays C++

查看:195
本文介绍了沿着多维数组C ++中的维度的最小值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我想在第三维的每个点找到最小值,

OpenCv支持对于2D矩阵的最小,最大寻找。

解决方案

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



代码:

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

int main()
{
int sizes [] = {10,7,5};
垫数据(3,尺寸,CV_32F);

//每个平面的初始化数据为一个不断增加的值
for(int z = 0; z {
范围range [] = {Range :: all(),Range :: all(),Range(z,z + 1)};
data(ranges)= data.size [2] - z;
}


//沿第三维计算最小值
Mat minmat(data.size [0],data.size [1],data.type() ,Scalar(DBL_MAX));

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

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

// minmat是一个包含(y,x)最小值的10x7垫z

return 0;
}

由于OpenCV更适合于2d矩阵,所以应该考虑使用<$



这是和上面相同的代码,但是我们可以使用这样的代码:c $ c> 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);
//每个平面的初始数据为恒定增加值
for(int z = 0; z {
data [z] = Mat (size_h,size_w,CV_32F,Scalar(size_z-z));
}

//沿第三维计算最小值
Mat minmat(size_h,size_w,CV_32F,Scalar(DBL_MAX));

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

// minmat是一个包含(y,x)最小值的10x7垫z

return 0;
}

要访问每个矩阵: data [index ] ,并且访问给定行和col的一个像素,您可以: data [index] .at< float>(row,col);


I have a 3D matrix of size (100,100,50).

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

I want to find minimum at every point along 3rd dimension to yield a 2D matrix.

OpenCv supports min,max finding only for 2D matrix. Please help me know if there are ready functions for min,max for nth dimension.

解决方案

You can slice the the 3D mat along the z dimension, and use cv::min to compare the slices.

Code:

#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;
}

Since OpenCV is better suited for 2d matrices, you should consider using a vector<Mat> instead (where each Mat in the vector is 2d).

This is the same code as above, using 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;
}

To access each matrix you do: data[index], and to access the a pixel at a given row and col, you do: data[index].at<float>(row, col);

这篇关于沿着多维数组C ++中的维度的最小值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆