I've been trying to add an image to large image at desired position. I found a way to add watermark in opencv by doing addWeighted(src, alpha, water,--,dst,--), but the problem is that both watermark and surface image should be of same sizes which I don't want.
Found another way (I guess)
Mat srcMat = cvCanvasImage.submat(top/2, (top + height)/2, left/2, (left + width)/2);
Imgproc.cvtColor(mat, srcMat, Imgproc.COLOR_GRAY2BGR,4);
But I don't understand how to do this??
Thanks..
UPDATE
Mat cvCanvasImage = Highgui.imread(Environment.getExternalStorageDirectory() + "/wallpapers/castle.jpg");
// Small watermark image
Mat cvWaterImage = Highgui.imread(Environment.getExternalStorageDirectory() +"/square.png");
Size canvasSize = cvWaterImage.size();
int rows = (int) canvasSize.height;
int cols = (int) canvasSize.width;
int left = 0;
int top = 0;
int width = rows;
int height = cols;
Rect ROI = new Rect(left, top, width, height);
Core.addWeighted(cvCanvasImage.submat(ROI), alpha, cvWaterImage, beta, 0, cvCanvasImage.submat(ROI));
//now it throws me this error
"error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function void cv::arithm_op(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, const cv::_InputArray&, int, void (**)(const uchar*, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*)"
I found a way to do it right.
Mat b = Highgui.imread(Environment.getExternalStorageDirectory() + "/castle.jpg");
// Small watermark image
Mat a = Highgui.imread(Environment.getExternalStorageDirectory() +"/square.png");
Mat bSubmat = b.submat(a.rows(), a.rows()*2, a.cols(), a.cols()*2);
a.copyTo(bSubmat);
Highgui.imwrite("mnt/sdcard/SubmatCopyToTest.png", b);
Something like this should work:
Mat waterMark = new Mat(width, height); //assumed as a smaller image than your source mat, with size (width, height).
Rect ROI = new Rect(x, y, width, height); // Position and size of your watermark;
Core.addWeighted(source.submat(ROI), alpha, waterMark, beta, gamma, source.submat(ROI));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With