2012-10-04 4 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