Is possible convert the Mat with two channels into a vector<vector<int>>

asked 2018-08-13 13:48:48 -0600

yode gravatar image

updated 2018-08-14 00:35:20 -0600

If I have a mat like

Mat mat = (Mat_<int>(1, 8) << 5, 6, 0, 4, 0, 1, 9, 9);

Of course I can convert mat into a vector vec by

vector<int> vec(mat.begin<int>(), mat.end<int>());

But when the mat have 2 or more channels, how to convert it into a vector<vector<int>>? I mean if I have such Mat

int vec[4][2] = { {5, 6}, {0, 4}, {0,1}, {9, 9} };
Mat mat(4,1,CV_32SC2,vec);

How to get a vector<vector<int>> vec2{ {5, 6}, {0, 4}, {0,1}, {9, 9} }? Of course we can traverse very pixel like this

vector<vector<int>> vec2;
for (int i = 0; i < 4; i++) {
    Vec2i*p = mat.ptr<Vec2i>(i);
    vec2.push_back(vector<int>());
    vec2[vec2.size() - 1].push_back(p[0][0]);
    vec2[vec2.size() - 1].push_back(p[0][1]);
}

But any better method can do this?

edit retag flag offensive close merge delete