java+opencv修改白色背景为图片
原图:
背景:
最终效果:
代码:
package com.machao;import com.machao.util.OpenCvUtils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import java.io.File;
import java.io.FilenameFilter;public class Picture extends OpenCvUtils {public static void main(String[] args) {Long begin = System.currentTimeMillis();String path = "F:\\opencv_test\\back";File file = new File(path);String[] files = file.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return name.toLowerCase().endsWith("jpg");}});Mat src,logo = null;for (String s : files) {System.out.println("处理中:" + s);// 获取背景图片src = Imgcodecs.imread("F:\\opencv_test\\bg_img\\back1.png", 1);// 读取需要处理的原图logo = Imgcodecs.imread(path + "//" + s,1);// 将文本原图二值处理,让文本不出现灰白色,不需要则注释Imgproc.threshold(logo,logo, 140, 255, Imgproc.THRESH_BINARY);// 设置图片背景setBackground(src, logo, s);}Long end = System.currentTimeMillis();System.out.println("处理完成,共耗时:"+((end-begin)/1000.0)+"s,平均每张图片耗时:"+((end-begin)/files.length/1000.0)+"/s");
// JOptionPane.showMessageDialog( null , "转换完成!" );}/*** 设置图片背景* @param src 背景图片* @param logo 当前图片* @param name 图片名称*/public static void setBackground(Mat src, Mat logo, String name){Mat mask = null;// 将背景大小重置为logo大小Imgproc.resize(src,src,logo.size());mask = logo.clone();Mat imgROI = src.submat(new Rect(0, 0, logo.cols(), logo.rows())); //Rect方法定义ROI,注意宽是:cols;高是rows。Core.bitwise_not(mask, mask);//对mask图像取反,白色(255)变成黑色(0)
// Imgproc.threshold(mask,mask, 80, 255, Imgproc.THRESH_BINARY);//对mask进行二值化,threshold处理彩色图是将rgb3值分别按照灰度值分割,只保留纯色
// Imgcodecs.imwrite("F:\\opencv_test\\back\\"+name.substring(0,name.indexOf("."))+"-mask.jpg", mask);logo.copyTo(imgROI, mask);//将logo拷贝到imgROI上,rgb为不为0的部分保留,为0的被置换为目标图的rgbImgcodecs.imwrite("F:\\opencv_test\\back\\"+name.substring(0,name.indexOf("."))+"-result.jpg", src);// 电脑垃圾,手动gc一下System.gc();}
}
package com.machao.util;import com.machao.TextAreaFind;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.springframework.util.ResourceUtils;import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;/*** * @类功能说明: openCv公共方法操作类型* * @作者:mayiwen* @创建时间:2019年10月16日 下午3:06:52 @版本:V1.0*/
public class OpenCvUtils{/*** 加载动态库*/public static void loadLibraries() {try {String osName = System.getProperty("os.name");String opencvpath = "dll/";// windowsif (osName.startsWith("Windows")) {
// int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
// // 32位系统
// if (bitness == 32) {
// opencvpath += "opencv_java320_x86.dll";
// }
// // 64位系统
// else if (bitness == 64) {opencvpath += "opencv_java412.dll";
// } else {
// opencvpath += "opencv_java320_x64.dll";
// }}File dll = ResourceUtils.getFile("classpath:"+opencvpath);opencvpath = dll.getAbsolutePath();System.load(opencvpath);} catch (Exception e) {throw new RuntimeException("Failed to load opencv native library", e);}}static {// 加载动态库loadLibraries();}}
java+opencv修改白色背景为图片相关推荐
- mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)
ROI相关简介 ROI是什么 ROI是region of interest首字母的简写,翻译为感性趣的区域.其实在写本篇之前应该写一篇关于图片是什么的学习笔记,但又感觉里面没多少东西还不能承载一篇学习 ...
- java代码修改数据库里图片_java如何修改sql存储的图片?
展开全部 :获取数据库连接 1:导入mysql的驱动jar包,mysql-connector-java-5.1.8-bin.jar 2:写代码连接数据库,如下323131333532363134313 ...
- java opencv 打开摄像头截取图片
先到官网下载 https://opencv.org/releases/ 我的是windows 版 下载好后打开自动解压,opencv文件夹,打开里面的build\java,将opencv-460.ja ...
- java JFrame修改左上角的图片
直接案例: 转载于:https://www.cnblogs.com/yichjin/p/5647248.html
- Android 10.0 修改Recovery字体图片的大小(正在清理)文字大小
1.概述 在10.0系统产品开发中,进行Recovery 恢复出厂设置时 发现 真正清理的 字体小了 产品不满意 所以要求改大一点字体 于是 就只能去看Recovery部分的源码 这部分都是C 语言的 ...
- java opencv 实现换脸
最近碰到个项目,要求是实现人脸交换,即如下图所示,将右边汤唯的脸换成左边鹿晗的脸,变成中间的照片,就是人脸交换. 网上一般都是基于opencv和Dlib来实现,且多为c++或python语言,或app ...
- Atitit Java OpenCV 捕获视频
Atitit Java OpenCV 捕获视频 ,打开一段视频或默认的摄像头 有两种方法,一种是在定义类的时候,一种是用open()方法. 一. 读取视频序列 OpenCV提供了一个简便易用的框架以 ...
- java中文件处理之图片_在Java 7中处理文件
java中文件处理之图片 以下是The Well-Grounded Java Developer的草稿的修改后的片段. 它使您快速了解与以前版本相比,在Java 7中操作文件要容易得多. 通过使用新的 ...
- java盒图_java合成图片
package com.pbids.sanqin.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.imag ...
最新文章
- linux下如何察看哪个进程在写硬盘
- Android--Matrix图片变换处理
- TCP/IP报文格式
- (原創) 如何讓P7010外接螢幕支援1440x900(WXGA+)? (NB) (P7010)
- 源码WIFI--扫描和连接
- matlab通过“ideal_lp设计理想高通滤波器_常见低通、高通、带通三种滤波器的工作原理...
- python爬虫实训心得_Python爬虫小结
- mysql 出现错误 Duplicate entry for key PRIMARY 解决办法
- Git中的bash与CMD的区别
- go error的理解
- Java虚拟机专题之class文件结构(读书笔记)
- mysql字段里面有16字节特殊字符替换
- Enigma密码机初步解析
- java 按 大写字母_用大写字母拆分字符串
- mysql如何防止幻读
- Java基础视频教程(2020年最新)
- Linux之日志服务及管理
- 简述 Spring Bean的生命周期
- CyclicBarrier---JDK1.8源码分析
- 原生JS获取QQ好友列表