Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Emgu CV and IInputArrayOfArrays on Merge() function

Tags:

c#

opencv

emgucv

I am struggling to understand what is an IInputArrayOfArrays.

It's a bit confusing when you check the docs of OpenCV or EmguCV and most of the functions got IInputArray or IOutputArray on the function parameters, but with some search you get to know that it means basically a Mat.

But in this case, I thought that a IInputArrayOfArrays must be an array of Mat, but this is not working on C#:

Mat[] channels = hsv.Split();
channels[1] = customMask;
CvInvoke.Merge(channels, hsv);

Because Can't convert from Emgu.CV.Mat[] to Emgu.CV.IInputArrayOfArrays.

Since the Split() function returns Mat[], it would be logical that the Merge() function (that is exactly the opposite of the Split()) needs a Mat[] also...

like image 797
juan carlos Avatar asked Sep 02 '25 16:09

juan carlos


1 Answers

Pay attention to not confuse CvInvoke.Split() and Mat.Split().

Using Mat.Split() will return a Mat[] but CvInvoke.Merge() does not accept that.

Instead, if you use CvInvoke.Split() it will return you a VectorOfVectorOfByte, the same type that the CvInvoke.Merge() method needs, making it exactly the opposite of the CvInvoke.Split() indeed.

Here's an example with your case:

VectorOfVectorOfByte splitted = new VectorOfVectorOfByte();
CvInvoke.Split(channels, splitted);
// ... //
CvInvoke.Merge(splitted, channels);
like image 101
erik7854 Avatar answered Sep 04 '25 04:09

erik7854