轉自爛代碼網: Java opencv 疊加圖片,添加logo圖
https://trashcode.cn/post/d/88c23686-ceb6-4bad-b17e-3cd4640c2cd6
利用Java Opencv包,疊加圖片
比如,有兩張圖片,背景圖,待添加的logo圖
背景圖:
待添加的logo圖:
1.添加Java Opencv的package,在maven中設置
<dependency> <groupId>org.bytedeco</groupId> <artifactId>opencv</artifactId> <version>4.3.0-1.5.3</version> </dependency>
2.將logo圖添加到背景圖左上角位置,代碼如下:
1 import static org.bytedeco.opencv.global.opencv_imgcodecs.imread; 2 import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite; 3 import static org.bytedeco.opencv.global.opencv_imgproc.resize; 4 import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvLoadImage; 5 import org.bytedeco.opencv.global.opencv_core; 6 import org.bytedeco.opencv.opencv_core.Mat; 7 import org.bytedeco.opencv.opencv_core.Rect; 8 import org.bytedeco.opencv.opencv_core.Size; 9 10 public void overlapPhoto() { 11 //背景圖 12 String sourceImg = "background.jpg"; 13 //待添加的背景圖logo 14 String addImg ="logo.jpg"; 15 //疊加以后的圖片文件名 16 String mixImgPath="overlayPhoto.jpg"; 17 try { 18 //讀取背景圖 19 Mat srcImageMat = imread(sourceImg); 20 //讀取logo圖片 21 Mat addImgMat = imread(addImg); 22 //獲取logo的寬 23 int addImgMatcols = addImgMat.cols(); 24 //獲取logo的高 25 int addImgMatrows = addImgMat.rows(); 26 //logger 輸出信息 27 LOGGER.info("addimg cols:{},rows:{},size:{}", addImgMatcols, addImgMatrows, addImgMat.size()); 28 29 //設置mask 30 Mat mask = imread(addImg,0); 31 32 //設置在背景圖上需要疊加的區域,如下,x,y為10開始,長寬分別為logo的長寬 33 //設置的長寬比如滿足x+logo.width<=src.width,y+logo.height<=src.width... 34 //否則 throw exception 35 Mat srcRoi = new Mat(srcImageMat, new Rect(10, 10, addImgMat.cols(), addImgMat.rows())); 36 LOGGER.info("srcRoi cols:{},rows:{}", srcRoi.cols(), srcRoi.rows()); 37 addImgMat.copyTo(srcRoi, mask); 38 //寫入圖片進行疊加 39 imwrite(mixImgPath, srcImageMat); 40 LOGGER.info(mixImgPath); 41 LOGGER.info("Overlap completed!"); 42 } catch (Exception e) { 43 LOGGER.error("", e); 44 } 45 }
結果如下:
*若無logger設置,將實例中logger替換為System.out.println 即可