我有一个大小为 (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/