2017-09-17 2 views
0

다른 이미지 위에 투명도가있는 사각형에 이미지를 오버레이하는 함수를 작성하려고하지만 이미지를 레이어링하지 않습니다. 오버레이 및 투명도가 전체 이미지를 잘라냅니다. 여기 내 코드가있다.Java OpenCV Layer 작은 이미지 투명도가 더 큰 이미지에

public static void overlayImage(String imagePath, String overlayPath, int x, int y, int width, int height) { 
    Mat overlay = Imgcodecs.imread(overlayPath, Imgcodecs.IMREAD_UNCHANGED); 
    Mat image = Imgcodecs.imread(imagePath, Imgcodecs.IMREAD_UNCHANGED); 

    Rectangle rect = new Rectangle(x, y, width, height); 
    Imgproc.resize(overlay, overlay, rect.size()); 
    Mat submat = image.submat(new Rect(rect.x, rect.y, overlay.cols(), overlay.rows())); 
    overlay.copyTo(submat); 
    Imgcodecs.imwrite(imagePath, image); 
} 

편집 : 여기에 몇 가지 예제 사진입니다 : 하기 전에 :

enter image description here

후 :

enter image description here

+0

항상 이미지와 결과를 게시하십시오. – zindarod

+0

@Zindarod 죄송합니다. – Jake

+0

여기에서 문제는 복사 한 후 오버레이 이미지의 알파 채널이 대상 이미지의 알파 채널보다 우선합니다. – zindarod

답변

0

내가 필요 정확히 수행이 기능을 발견.

public static void overlayImage(Mat background,Mat foreground,Mat output, Point location){ 

    background.copyTo(output); 

    for(int y = (int) Math.max(location.y , 0); y < background.rows(); ++y){ 

    int fY = (int) (y - location.y); 

    if(fY >= foreground.rows()) 
      break; 

     for(int x = (int) Math.max(location.x, 0); x < background.cols(); ++x){ 
      int fX = (int) (x - location.x); 
      if(fX >= foreground.cols()){ 
      break; 
      } 

      double opacity; 
      double[] finalPixelValue = new double[4]; 

      opacity = foreground.get(fY , fX)[3]; 

      finalPixelValue[0] = background.get(y, x)[0]; 
      finalPixelValue[1] = background.get(y, x)[1]; 
      finalPixelValue[2] = background.get(y, x)[2]; 
      finalPixelValue[3] = background.get(y, x)[3]; 

      for(int c = 0; c < output.channels(); ++c){ 
       if(opacity > 0){ 
        double foregroundPx = foreground.get(fY, fX)[c]; 
        double backgroundPx = background.get(y, x)[c]; 

        float fOpacity = (float) (opacity/255); 
        finalPixelValue[c] = ((backgroundPx * (1.0 - fOpacity)) + (foregroundPx * fOpacity)); 
        if(c==3){ 
         finalPixelValue[c] = foreground.get(fY,fX)[3]; 
        } 
       } 
      } 
      output.put(y, x,finalPixelValue); 
     } 
    } 
} 
관련 문제