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);
      try{
        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实现展示视频或图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java获取视频时长及截取帧截图详解

    前言 只是最近碰到有这方面的项目需求,所以简单 Mark 下本文.下面的示例是参考过他人分享的文章,之后本人再自行实践.调整和测试过的,希望对有这方面需求的人有所帮助. 示例 添加依赖 <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.4.4</version> </depe

  • java使用FFmpeg合成视频和音频并获取视频中的音频等操作(实例代码详解)

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. ffmpeg命令参数如下: 通用选项 -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的... -f fmt 强迫采用格式fmt -I filename 输入文件 -y 覆盖输出文件 -t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持 -ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持 -title

  • Java使用OpenCV3.2实现视频读取与播放

    Java使用OpenCV3.2实现视频读取与播放,供大家参考,具体内容如下 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务.可以说OpenCV C++ SDK可以做到绝大多数事情,在OpenCV3.x版本上用Java都可以完成,这样就为很多Java开发者学习OpenCV打开了方便之门. 实现思路 首先用OpenCV相关API读

  • JavaCV实现获取视频每帧并保存

    兴趣使然写的代码,因为没有接触过JavaCV,所以查了很久的API还有依赖包,也使用了openCV来写过,但是还是遇到很多问题.希望小伙伴指出不足,互相学习. 环境配置: JavaCV1.4.1(下载Jar包,解压并提取所需要的Jar.这点耗时比较长,萌新完全不知道需要用什么,看源码及例子推出) Java版本:Java10 具体代码: package VideoProcessing; import org.bytedeco.javacv.FFmpegFrameGrabber; import or

  • java将m3u8格式转成视频文件的方法

    这是一次尝试,android手机将在线的m3u8小电影保存到手机端,手机端把文件复制到电脑端. 然后使用小工具合并成可播放的视频. /** * 合并视频文件 * */ public class MergeVideos { /** * source为源地址,destination为合并之后的文件地址,videoName为合并后视频的名字,num为视频数量 * @param source * @param destination * @throws IOException */ public sta

  • 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

  • 利用OPENCV为android开发畸变校正的JNI库方法

    需要为项目提供一套畸变校正的算法,由于需要大量的矩阵运算,考虑到效率和适时性,使用JNI开发,希望把有关数组短阵的处理的变换全部放入C语言中处理. 主要用于android移动端,大致的数据来源一是从camera直接读取YUV数据,一种是从第三方接读取RGB数据,另一种是直接对BITMAP进行处理. 1.考虑到硬件设备接口,第三方软件接口,图像接口,OPENCV接口,希望能够开发出通用的算法库,一劳永逸的解决各种复杂的使用场景,因此数据要支持YUV,支持ARGB,支持MAT 2android对BI

  • java实现统计字符串中字符及子字符串个数的方法示例

    本文实例讲述了java实现统计字符串中字符及子字符串个数的方法.分享给大家供大家参考,具体如下: 这里用java实现统计字符串中的字符(包括数字.大写字母.小写字母以及其他字符)个数,以及字符串的子字符串的个数. 运行效果图如下: 具体代码如下: import java.util.Scanner; public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(Str

  • 利用SpannableString和ImageSpan在textview中插入图片的方法

    默认的TextView是无法显示图片的.所以想要实现这个功能得需要我们自己为其添加一个方法. 在这里我们采用SpannableString和ImageSpan两个类来实现这一功能. 先上效果图: main.xml布局文件.我们使用自己定义的EditText <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c

  • python利用opencv保存、播放视频

    代码已上传至:https://gitee.com/tqbx/python-opencv/tree/master/Getting_started_videos 目标 学习读取视频,播放视频,保存视频. 学习从相机中捕捉帧并展示. 学习cv2.VideoCapture(),cv2.VideoWriter()的使用 从相机中捕捉视频 通过自带摄像头捕捉视频,并将其转化为灰度视频显示出来. 基本步骤如下: 1.首先创建一个VideoCapture对象,它的参数包含两种: 设备索引,指定摄像机的编号. 视

  • 利用Java+Selenium+OpenCV模拟实现网页滑动验证

    目录 一.需求分析 二.模拟步骤 1.使用selenium打开某音网页 2.找到小滑块以及小滑块所在的背景图 3.计算小滑块需要滑动的距离 4.按住小滑块并滑动 三.学习过程中比较棘手的问题 1.截图问题 2.返回结果与实际滑动距离相差太多,甚至无规律可循 3.openCV的下载安装 四.总结 目前很多网页都有滑动验证,目的就是防止不良爬虫扒他们网站的数据,我这次本着学习的目的使用Java和selenium学习解决滑动验证的问题,前前后后花了一周时间(抄代码),终于成功了某音的滑动验证! 效果展

  • Java利用Map实现计算文本中字符个数

    目录 一.题目要求 二.分析 三.部分代码展示 四.全部代码 五.结果截图(部分) 六.a.txt文本 一.题目要求 有一个英文的文本文档a.txt , 需要读取该文本文档并计算文档中英文字符出现的次数,最后打印输出 注意:map集合只能放入英文字符,不能够有空格数字引号等字符,所以在写代码的时候需要额外的进行判断,还需要考虑的一点是英文字符是有大小写的,但是统计在map里面就不区分大小写 二.分析 1.需要先获取文档的路径,并创建HashMap作为存放次数的容器,key的类型为Characte

  • java使用OpenCV从视频文件中获取帧

    本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境要求:需要安装Opencv,安装FFmpeg,下载javacv包 操作系统:本次实验使用的Ubuntu系统 实验代码 import com.googlecode.javacv.cpp.opencv_highgui; import org.opencv.core.Core; import org.op

  • 利用OpenCV实现绿幕视频背景替换

    目录 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 前言 本文将使用OpenCV C++ 进行绿幕视频背景替换. 一.图像预处理 背景 绿幕视频 首先,我们需要使用resize API将背景图尺寸修改与视频尺寸大小.这样才能进行后续的像素赋值操作. Mat bg = imread("background.jpg"); //背景图 VideoCapture capture; //读取待处理的绿幕视

  • Java利用沙箱支付实现电脑扫码支付教程

    目录 一.准备工作 二.效果展示 三.实现代码 3.1 后台代码 3.2 前台代码 一.准备工作 1.注册支付宝开放平台账号,成为开发者. 地址:https://open.alipay.com/platform/home.htm 2.进入沙箱,进行配置. 3.我们可以看到这个界面 4.后面需要使用的参数 APPID 商户私钥(使用系统默认密钥的公钥模式,点击查看获取) 支付宝公钥 支付宝网关 5.手机上下载沙箱支付宝 (到时候支付用这个支付宝支付) 6.下载好支付宝沙箱版后,登录支付宝提供的账号

随机推荐