2012-10-04 13 views
5

私は大きな画像に希望の位置に画像を追加しようとしています。 addWeighted(src、alpha、water、 - 、dst、 - )を実行してopencvにウォーターマークを追加する方法を見つけましたが、問題はウォーターマークとサーフェスイメージが同じサイズでなければならないということです。ウォーターマークをつけた小さな画像を大きな画像に追加するopencv4android

は別の方法(私は推測)

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

が見つかりましたが、私はこれを行う方法を理解していません?

おかげでこのように動作するはずです。..

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

答えて

5

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

私はあなたの方法を適用し、私の質問を更新しましたので、見てください。とにかく迅速な対応に感謝します。 – Khawar

+0

解決済み、ありがとう – Khawar

関連する問題