How to access slices of a 3d matrix in OpenCV

2020-07-14 09:25发布

问题:

I would like to store 592 47x47 arrays into a 47x47x592 Matrix. I created the 3d Matrix as follows:

int sizes[] = {47,47,592};
Mat 3dmat(3, sizes, CV_32FC1);

I then thought I could access it by using a set of ranges as in the following.

Range ranges[3];
ranges[0] = Range::all();
ranges[1] = Range::all();
ranges[2] = Range(x,x+1) //within a for loop.
Mat 2dmat = 3dmat(ranges);

However, when I try to use the copyTo function to input an existing data set, it does not work.

data.copyTo(2dmat); //data is my 47x47 matrix

The 3d matrix does not get updated when I do this.

Any information is appreciated! Thanks!

edit: I store the 592 matrices in this 3d matrix so that I can then later access each of the individual 47x47 matrices in another loop. So I would later do something of this sort:

2dmat = 3dmat(ranges);
2dmat.copyTo(data);

So I would then perform some operations using this data matrix. And in the next iteration of the loop, I would use the next stored data matrix.

回答1:

An alternative, vector-based solution:

std::vector<cv::Mat> mat(592, cv::Mat(47, 47, CV_32FC1)); // allocates 592 matrices sized 47 by 47
for(auto &m: mat) {
    // do your processsing here
    data.copyTo(m);
}


回答2:

By setting the proper size of the slice, you should be good to go:

cv::Mat slice = mat3D(ranges).clone();
cv::Mat mat2D;
mat2D.create(2, &(mat3D.size[0]), mat3D.type());
slice.copySize(mat2D);

Now slice contains your 2D slice.



标签: c opencv matrix