【发布时间】:2020-03-11 22:25:45
【问题描述】:
我有一个大小为 (10, rows=M, cols=N) 的 3 维 cv::Mat。这是 10 张图像,MxN 像素堆叠在一个立方体中。我想在图像的维度中按行对多维数据集进行切片,以便最后我有 M 个 (10, N) 切片,我将在这些切片上应用一些其他 opencv 算法。我发现我可以用 cv::Ranges();但是,我必须使用 reshape 使其成为 2D,因此我必须使用 clone() 使切片连续。下面是我用来执行此操作的代码 sn-p,但执行时间很慢(我认为对每个行切片执行的克隆/复制执行此操作)。有一个更好的方法吗?我还发现了this,这并不令人鼓舞。
const int img_dim[3] = {10, 20, 40};
Mat data = Mat::zeros(3, img_dim, CV_64FC1);
for (int row = 0; row < data.size[1]; row++ {
std::vector<Range> range;
range.push_back(Range(0, data.size[0]));
range.push_back(Range(row, row+1));
range.push_back(Range(0, data.size[2]));
// Below slice is still 3D with (10, 1, 40) so I use reshape to make it (10, 40)
// which requires the clone()
Mat slice = data(&range[0]).clone();
const int sz[] {data.size[0], data.size[2]};
slice = slice.reshape(1, 2, sz);
// Processing of slice
// e.g cv::GaussianBlur(slice, dst, Size(0,0), r, r);
}
【问题讨论】: