我有一个大小为(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维的最小值,最大值的就绪函数。
答案 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)
;