Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

assuming, you have 2 images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

assuming, you have 2 (float) images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

assuming, you have 2 (float) images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

but careful ! your blob does NOT hold a deep copy of the data, so C has to be kept alive during the processing !

assuming, you have 2 (float) images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

but careful ! your blob does NOT hold a deep copy of the data, so C has to be kept alive during the processing !

EDIT: due to public demand, here's the reverse operation ;)

// extract 2d, 6chan Mat
Mat c2(ocv.rows, ocv.cols, CV_32FC(6), blob.ptr(0));

// split into channels
vector<Mat> v2;
split(c2,v2);

// merge back into 2 images
Mat a,b;
merge(vector<Mat>(v2.begin(),   v2.begin()+3), a);
merge(vector<Mat>(v2.begin()+3, v2.end()),     b);

assuming, you have 2 (float) images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

but careful ! your blob does NOT hold a deep copy of the data, so C has to be kept alive during the processing !

EDIT: due to public demand, here's the reverse operation ;)

// extract 2d, 6chan Mat
Mat c2(ocv.rows, ocv.cols, c2(A.rows, A.cols, CV_32FC(6), blob.ptr(0));

// split into channels
vector<Mat> v2;
split(c2,v2);

// merge back into 2 images
Mat a,b;
merge(vector<Mat>(v2.begin(),   v2.begin()+3), a);
merge(vector<Mat>(v2.begin()+3, v2.end()),     b);

assuming, you have 2 (float) images A and B of equal size, 3 channels each, you could first merge them like this:

vector<Mat> v = {A,B};
Mat C;
merge(v, C);

now C has 6 interleaved channels, and we need to add the "batch" dimension:

int sz[] = {1, A.rows, A.cols, 6};
Mat blob(4, sz, CV_32F, C.data);

but careful ! your blob does NOT hold a deep copy of the data, so C has to be kept alive during the processing !

EDIT: due to public demand, here's the reverse operation ;)

// extract 2d, 6chan Mat
Mat c2(A.rows, A.cols, c2(blob.size[2], blob.size[3], CV_32FC(6), blob.ptr(0));

// split into channels
vector<Mat> v2;
split(c2,v2);

// merge back into 2 images
Mat a,b;
merge(vector<Mat>(v2.begin(),   v2.begin()+3), a);
merge(vector<Mat>(v2.begin()+3, v2.end()),     b);