最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用opencv實(shí)現(xiàn)用字符展示視頻或圖片的方法

 更新時(shí)間:2020年12月31日 10:07:12   作者:Litluecat  
這篇文章主要介紹了Java利用opencv實(shí)現(xiàn)用字符展示視頻或圖片的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

背景:前段時(shí)間看到有人將圖片轉(zhuǎn)成符號(hào),感覺挺有意思的,就結(jié)合了一下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.*;

/**
 * 將圖片轉(zhuǎn)成text文件輸出
 * @author Litluecat
 */
public class Image2Text {

  static {
    //opencv_java410.dll的所在地址,自己換成自己dll的地址
    System.load("D:\\Sofeware\\opencv\\build\\java\\x64\\opencv_java410.dll");
  }

  /** 此處設(shè)置灰度字符*/
  private static char[] cs = new char[] {'0','1','.',' '};

  public static void main(String[] args) throws IOException {
    //String imageUrl = "E:\\1.png";
    // 設(shè)置JTextArea,用于展示字符
    JTextArea textArea = getJFrame("XXTop", "宋體", 0, 2, 900, 900);
    // 將圖片轉(zhuǎn)成字符
    //textArea.setText(image2Text(imageUrl,1).toString());
    //將視頻轉(zhuǎn)成字符
    video2TextByOpenCV(textArea, "E:\\1.mp4", 1);
  }

  /**
   * 生成JFrame窗口,并返回JTextArea對(duì)象
   * @param frameTitle 窗口標(biāo)題
   * @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();
    //創(chuàng)建一個(gè)窗口對(duì)象
    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());
    //當(dāng)TextArea里的內(nèi)容過長(zhǎng)時(shí)生成滾動(dòng)條
    panel.add(new JScrollPane(textArea));
    frame.add(panel);
    //對(duì)窗口設(shè)置標(biāo)題
    frame.setTitle(frameTitle);
    //設(shè)置窗口的大小
    frame.setSize(JFWideth,JFHeight);
    //設(shè)置窗口界面的關(guān)閉按鈕真的生效(也可以直接傳一個(gè)3進(jìn)去,JFrame.EXIT_ON_CLOSE==3,效果一樣)
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //設(shè)置窗口居中顯示
    frame.setLocationRelativeTo(null);
    //設(shè)置窗口置頂顯示
    frame.setAlwaysOnTop(true);
    //設(shè)置窗口顯示
    frame.setVisible(true);
    return textArea;
  }

  /**
   * OpenCV-4.1.0 從視頻文件中讀取
   * @param textArea JTextArea文本框?qū)ο?
   * @param targetImgUrl 視頻地址
   * @param img2TextSzie 圖片轉(zhuǎn)文本縮小比例
   */
  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("圖片識(shí)別異常");
        break;
      }
    }
  }

  /**
   *基于openCV實(shí)現(xiàn)
   * @param image 待處理Mat圖片(視頻中的某一幀)
   * @param size 對(duì)結(jié)果進(jìn)行縮小,1為不縮小
   */
  public static StringBuffer image2TextByOpenCV(Mat image,int size) throws Exception{
    StringBuffer text = null;
    Mat img_mat = new Mat();
    //mat表示要要轉(zhuǎn)換的圖片[Mat類型],img_mat表示轉(zhuǎn)換后的圖片
    Imgproc.cvtColor(image, img_mat, Imgproc.COLOR_RGB2GRAY);
    int rows = img_mat.rows();
    int cols = img_mat.cols();
    // 圖片轉(zhuǎn)字符串后的數(shù)組
    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 表示像素點(diǎn)的位置(姑且理解為像素點(diǎn)吧)
        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();
    // 開始拼接內(nèi)容
    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 對(duì)結(jié)果進(jìn)行縮小,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();
      // 圖片轉(zhuǎn)字符串后的數(shù)組
      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();
      // 開始拼接內(nèi)容
      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;
  }

}

效果如下:

在這里插入圖片描述

到此這篇關(guān)于Java利用opencv實(shí)現(xiàn)用字符展示視頻或圖片的方法的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)展示視頻或圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解

    Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解

    這篇文章主要為大家介紹了Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Lombok的@Accessors使用說明

    Lombok的@Accessors使用說明

    這篇文章主要介紹了Lombok的@Accessors使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java通過反射,如何動(dòng)態(tài)修改注解的某個(gè)屬性值

    Java通過反射,如何動(dòng)態(tài)修改注解的某個(gè)屬性值

    這篇文章主要介紹了Java通過反射,動(dòng)態(tài)修改注解的某個(gè)屬性值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JDK21新特性Record?Patterns記錄模式詳解(最新推薦)

    JDK21新特性Record?Patterns記錄模式詳解(最新推薦)

    這篇文章主要介紹了JDK21新特性Record?Patterns記錄模式詳解,本JEP建立在Pattern?Matching?for?instanceof(JEP?394)的基礎(chǔ)上,該功能已在JDK?16中發(fā)布,它與Pattern?Matching?for?switch(JEP?441)共同演進(jìn),需要的朋友可以參考下
    2023-09-09
  • knife4j+springboot3.4異常無(wú)法正確展示文檔

    knife4j+springboot3.4異常無(wú)法正確展示文檔

    本文主要介紹了knife4j+springboot3.4異常無(wú)法正確展示文檔,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼

    Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼

    本篇文章主要介紹了Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java將數(shù)字價(jià)格轉(zhuǎn)換為中文大寫代碼示例(工具類)

    java將數(shù)字價(jià)格轉(zhuǎn)換為中文大寫代碼示例(工具類)

    這篇文章主要介紹了java將數(shù)字價(jià)格轉(zhuǎn)換為中文大寫的相關(guān)資料,在Java中實(shí)現(xiàn)將數(shù)字價(jià)格轉(zhuǎn)換為中文大寫需要將數(shù)字分解為各個(gè)部分(如個(gè)位、十位、百位等),并根據(jù)這些部分轉(zhuǎn)換為對(duì)應(yīng)的中文大寫數(shù)字,需要的朋友可以參考下
    2024-10-10
  • Java的jmap命令的具體使用

    Java的jmap命令的具體使用

    jmap是JDK提供的一個(gè)可以生成Java虛擬機(jī)的堆轉(zhuǎn)儲(chǔ)快照dump文件的命令行工具,本文主要介紹了Java的jmap命令的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java遠(yuǎn)程調(diào)用接口、URL的方式代碼

    java遠(yuǎn)程調(diào)用接口、URL的方式代碼

    我們都知道接口有自己本地的,也有遠(yuǎn)程別人寫好的,而調(diào)用遠(yuǎn)程接口的就需要使用遠(yuǎn)程調(diào)用啦,這篇文章主要給大家介紹了關(guān)于java遠(yuǎn)程調(diào)用接口、URL的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Maven依賴junit?@Test報(bào)錯(cuò)的解決方案

    Maven依賴junit?@Test報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Maven依賴junit?@Test報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

醴陵市| 长泰县| 中江县| 宁明县| 新郑市| 察哈| 合山市| 五大连池市| 新泰市| 皋兰县| 长丰县| 濮阳县| 达州市| 泽库县| 靖州| 金华市| 德格县| 静安区| 尤溪县| 金寨县| 景洪市| 准格尔旗| 仁寿县| 石柱| 延吉市| 延寿县| 磴口县| 乌海市| 仲巴县| 峨山| 民丰县| 精河县| 防城港市| 京山县| 北安市| 泽普县| 囊谦县| 左贡县| 长春市| 绥德县| 辉南县|