5

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*)"
Rui Marques
  • 8,567
  • 3
  • 60
  • 91
Khawar
  • 859
  • 11
  • 30

2 Answers2

6

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);
Khawar
  • 859
  • 11
  • 30
2

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));
Rui Marques
  • 8,567
  • 3
  • 60
  • 91
  • I've applied your way and updated my question, please have a look. thanks anyway for quick response. – Khawar Oct 04 '12 at 10:30