添加水印小图像到大图像opencv4android

时间:2012-10-04 06:51:40

标签: android image opencv image-processing watermark

我一直在尝试将图像添加到所需位置的大图像。我找到了一种通过addWeighted(src,alpha,water, - ,dst, - )在opencv中添加水印的方法,但问题是水印和表面图像应该是我不想要的相同尺寸。

找到另一种方式(我猜)

Mat srcMat = cvCanvasImage.submat(top/2, (top + height)/2, left/2, (left + width)/2);
Imgproc.cvtColor(mat, srcMat, Imgproc.COLOR_GRAY2BGR,4);

但我不明白该怎么做?

谢谢..

更新

     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*)"

2 个答案:

答案 0 :(得分:6)

我找到了一种正确的方法。

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);

答案 1 :(得分:2)

这样的事情应该有效:

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));