opencv android java matrix submatrix (ROI Region of Interest)

3.8k views Asked by At

I've mRgba Matrix and a Rect r (something recognized in the frame)

I want a sub-matrix of this part of the frame which is defined by the Rect r.

when I use it like this:

sub = mRgba.submat(r);

I get the right sub-matrix, but I've a problem with the next steps, I want to change this part of the frame and then copy it back to the original.

For example:

 Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY, 1); //make it gray
 Imgproc.cvtColor(sub, sub, Imgproc.COLOR_GRAY2RGBA, 4); //change to rgb

How can I copy this changed sub-matrix back to the original. or how can I get/create a Mask same size as mRgba with all zeros except the Rect r part?

2

There are 2 answers

1
ddd On BEST ANSWER
sub = mRgba.submat(r);

Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY, 1); //make it gray
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_GRAY2RGBA, 4); //change to rgb

sub.copyTo(mRgba.submat(r));

ok this seems to do the trick :) it copies the changed subpicture/matrix back in the region of the source.. (what is normally done with setROI and copyto)

2
Andrey Kamaev On

Your code does not work as you expected because it is impossible to change number of colors in-place. You need a temporary matrix to make it work:

Mat tmp;
Imgproc.cvtColor(sub, tmp, Imgproc.COLOR_RGBA2GRAY); //make it gray
Imgproc.cvtColor(tmp, sub, Imgproc.COLOR_GRAY2RGBA); //change to rgb