转自烂代码网: 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 即可