在OpenCV4Android中将水印小图添加到大图中

5
我一直在努力将图像添加到所需位置的大图像中。我发现通过执行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个回答

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

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

我已经采用了您的方法并更新了我的问题,请看一下。无论如何,感谢您的快速回复。 - Khawar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接