更新时间:2020年12月31日 10:07:12   作者:Litluecat
这篇文章主要介绍了Java利用opencv实现用字符展示视频或图片的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

背景:前段时间看到有人将图片转成符号,感觉挺有意思的,就结合了一下opencv。
代码如下:

package org.fxd.utils; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; import org.opencv.videoio.VideoCapture; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; * 将图片转成text文件输出 * @author Litluecat public class Image2Text { static { //opencv_java410.dll的所在地址,自己换成自己dll的地址 System.load("D:\\Sofeware\\opencv\\build\\java\\x64\\opencv_java410.dll"); /** 此处设置灰度字符*/ private static char[] cs = new char[] {'0','1','.',' '}; public static void main(String[] args) throws IOException { //String imageUrl = "E:\\1.png"; // 设置JTextArea,用于展示字符 JTextArea textArea = getJFrame("XXTop", "宋体", 0, 2, 900, 900); // 将图片转成字符 //textArea.setText(image2Text(imageUrl,1).toString()); //将视频转成字符 video2TextByOpenCV(textArea, "E:\\1.mp4", 1); * 生成JFrame窗口,并返回JTextArea对象 * @param frameTitle 窗口标题 * @param fontName 文本框中字体类型 * @param fontStyle 文本框中字体格式 * @param fontSize 文本框中字体大小 * @param JFWideth 窗口宽度 * @param JFHeight 窗口高度 * @return public static JTextArea getJFrame(String frameTitle,String fontName, int fontStyle, int fontSize, int JFWideth, int JFHeight){ JFrame frame = new JFrame(); //创建一个窗口对象 JPanel panel = new JPanel(); JTextArea textArea = new JTextArea(); // name:字体类型 style:0,表示字形;1,粗体;2,斜体 size:字体大小 textArea.setFont(new Font(fontName,fontStyle,fontSize)); panel.setLayout(new GridLayout()); //当TextArea里的内容过长时生成滚动条 panel.add(new JScrollPane(textArea)); frame.add(panel); //对窗口设置标题 frame.setTitle(frameTitle); //设置窗口的大小 frame.setSize(JFWideth,JFHeight); //设置窗口界面的关闭按钮真的生效(也可以直接传一个3进去,JFrame.EXIT_ON_CLOSE==3,效果一样) frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口居中显示 frame.setLocationRelativeTo(null); //设置窗口置顶显示 frame.setAlwaysOnTop(true); //设置窗口显示 frame.setVisible(true); return textArea; * OpenCV-4.1.0 从视频文件中读取 * @param textArea JTextArea文本框对象 * @param targetImgUrl 视频地址 * @param img2TextSzie 图片转文本缩小比例 public static void video2TextByOpenCV(JTextArea textArea, String targetImgUrl, int img2TextSzie) { VideoCapture capture=new VideoCapture(); //1 读取视频文件的路径 capture.open(targetImgUrl); if(!capture.isOpened()){ System.out.println("读取视频文件失败!"); return; Mat video=new Mat(); while(capture.isOpened()) { //2 视频文件的视频写入 Mat video 中 capture.read(video); textArea.setText(image2TextByOpenCV(video,img2TextSzie).toString()); }catch (Exception e){ System.out.println("图片识别异常"); break; *基于openCV实现 * @param image 待处理Mat图片(视频中的某一帧) * @param size 对结果进行缩小,1为不缩小 public static StringBuffer image2TextByOpenCV(Mat image,int size) throws Exception{ StringBuffer text = null; Mat img_mat = new Mat(); //mat表示要要转换的图片[Mat类型],img_mat表示转换后的图片 Imgproc.cvtColor(image, img_mat, Imgproc.COLOR_RGB2GRAY); int rows = img_mat.rows(); int cols = img_mat.cols(); // 图片转字符串后的数组 char[][] css = new char[rows/size + 1][cols/size + 1]; for(int x=0; x<rows; x+=size){ for (int y=0; y<cols; y+=size){ //获得图片的灰度值 x,y 表示像素点的位置(姑且理解为像素点吧) int gray = (int) img_mat.get(x, y)[0]; // 得到灰度值 int index = Math.round((gray * cs.length -1) / 255); css[x/size][y/size] = cs[index]; StringBuffer sb = new StringBuffer(); // 开始拼接内容 for (int x = 0; x < css.length; x++) { for (int y = 0; y < css[0].length; y++) { sb.append(css[x][y]); sb.append("\r\n"); return sb; * @param imageUrl 图片地址 * @param size 对结果进行缩小,1为不缩小 public static StringBuffer image2Text(String imageUrl,int size){ StringBuffer text = null; try { BufferedImage image = ImageIO.read(new File(imageUrl)); int width = image.getWidth(); int height = image.getHeight(); // 图片转字符串后的数组 char[][] css = new char[width/size + 1][height/size + 1]; for (int x = 0; x < width; x+=size) { for (int y = 0; y < height; y+=size) { int rgb = image.getRGB(x, y); Color c = new Color(rgb); // 得到灰度值 int cc = (c.getRed() + c.getGreen() + c.getBlue()) / 3; css[x/size][y/size] = cs[(int) ((cc * cs.length - 1) / 255)]; StringBuffer sb = new StringBuffer(); // 开始拼接内容 for (int y = 0; y < css[0].length; y++) { for (int x = 0; x < css.length; x++) { sb.append(css[x][y]); sb.append("\r\n"); text = sb; } catch (IOException e) { System.out.println(e); return text;

效果如下:

到此这篇关于Java利用opencv实现用字符展示视频或图片的方法的文章就介绍到这了,更多相关java实现展示视频或图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • 微信支付java版本之获取Access_token

    微信支付java版本之获取Access_token

    这篇文章主要介绍了微信支付java版本之获取Access_token,java如何获取Access_token,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • idea将maven项目改成Spring boot项目的方法步骤

    idea将maven项目改成Spring boot项目的方法步骤

    这篇文章主要介绍了idea将maven项目改成Spring boot项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Java的Spring框架中的注解的用法

    详解Java的Spring框架中的注解的用法

    这篇文章主要介绍了Java的Spring框架中的注解的用法,包括对Java bean的定义的作用介绍,需要的朋友可以参考下
    2015-11-11
  • Javaweb项目启动Tomcat常见的报错解决方案

    Javaweb项目启动Tomcat常见的报错解决方案

    Java Web项目启动Tomcat时可能会遇到各种错误,本文就来介绍一下Javaweb项目启动Tomcat常见的报错解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • springboot依赖冲突问题及解决过程

    springboot依赖冲突问题及解决过程

    新搭了一个springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的过程中,启动报错,怎么解决这个问题呢,下面小编给大家带来了springboot依赖冲突问题及解决过程,一起看看吧
    2021-09-09
  • java中的forkjoin框架的使用

    java中的forkjoin框架的使用

    这篇文章主要介绍了java中的fork join框架的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 简单操作实现Java jsp servlet文件上传过程解析

    简单操作实现Java jsp servlet文件上传过程解析

    这篇文章主要介绍了简单操作实现Java jsp servlet文件上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Spring Boot中如何使用Convert接口实现类型转换器

    Spring Boot中如何使用Convert接口实现类型转换器

    这篇文章主要介绍了Spring Boot中使用Convert接口实现类型转换器的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java 实现图片圆角处理、背景透明化

    java 实现图片圆角处理、背景透明化

    这篇文章主要介绍了java 实现图片圆角处理、背景透明化,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Springboot如何使用YML文件配置多环境

    Springboot如何使用YML文件配置多环境

    这篇文章主要介绍了Springboot如何使用YML文件配置多环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01