您可以沿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);