2012-10-04 3 views
5

Ich habe versucht, ein Bild zu einem großen Bild an der gewünschten Position hinzuzufügen. Ich habe eine Möglichkeit gefunden, Wasserzeichen in opencv hinzuzufügen, indem ich addWeighted (src, alpha, water, -, dst, -) benutze, aber das Problem ist, dass sowohl Wasserzeichen als auch Oberflächenbild dieselbe Größe haben sollen, die ich nicht möchte.Wasserzeichen kleines Bild zu großes Bild hinzufügen opencv4android

Gefunden eine andere Art und Weise (ich glaube)

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

Aber ich verstehe nicht, wie dies zu tun ??

Dank ..

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

Antwort

5

fand ich einen Weg, um es richtig zu machen.

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

So etwas sollte funktionieren:

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

Ich habe Ihren Weg beantragt und meine Frage aktualisiert, bitte schauen Sie. Danke trotzdem für die schnelle Antwort. – Khawar

+0

löste es, danke – Khawar