2012-10-04 17 views
5

Próbowałem dodać obraz do dużego obrazu w pożądanej pozycji. Znalazłem sposób na dodanie znaku wodnego w opencv przez dodanie addWeighted (src, alpha, water, -,, dst, -), ale problem polega na tym, że zarówno znak wodny, jak i obraz powierzchni powinny być tego samego rozmiaru, którego nie chcę.dodaj znak wodny małego obrazu do dużego obrazu opencv4android

znaleźć inny sposób (chyba)

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

Ale ja nie rozumiem, jak to zrobić ??

Dzięki ..

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

Odpowiedz

5

znalazłem sposób, aby zrobić to dobrze.

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

Coś jak to powinno działać:

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

Zastosowałem sposób i zaktualizowałem moje pytanie, proszę spojrzeć. i tak dziękuję za szybką odpowiedź. – Khawar

+0

rozwiązać, dzięki – Khawar

Powiązane problemy