Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法
背景:前段時間看到有人將圖片轉(zhuǎn)成符號,感覺挺有意思的,就結(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對象 * @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(); //創(chuàng)建一個窗口對象 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里的內(nèi)容過長時生成滾動條 panel.add(new JScrollPane(textArea)); frame.add(panel); //對窗口設(shè)置標題 frame.setTitle(frameTitle); //設(shè)置窗口的大小 frame.setSize(JFWideth,JFHeight); //設(shè)置窗口界面的關(guān)閉按鈕真的生效(也可以直接傳一個3進去,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("圖片識別異常"); break; } } } /** *基于openCV實現(xiàn) * @param image 待處理Mat圖片(視頻中的某一幀) * @param size 對結(jié)果進行縮小,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 表示像素點的位置(姑且理解為像素點吧) 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 對結(jié)果進行縮小,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實現(xiàn)用字符展示視頻或圖片的方法的文章就介紹到這了,更多相關(guān)java實現(xiàn)展示視頻或圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實現(xiàn)源碼下載編譯及導入IDEA過程圖解
這篇文章主要介紹了Spring實現(xiàn)源碼下載編譯及導入IDEA,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07Java內(nèi)存劃分:運行時數(shù)據(jù)區(qū)域
聽說Java運行時環(huán)境的內(nèi)存劃分是挺進BAT的必經(jīng)之路,這篇文章主要給大家介紹了關(guān)于Java運行時數(shù)據(jù)區(qū)域(內(nèi)存劃分)的相關(guān)資料,需要的朋友可以參考下2021-07-07關(guān)于SpringSecurity簡介以及和Shiro的區(qū)別
這篇文章主要介紹了關(guān)于SpringSecurity簡介以及和Shiro的區(qū)別,在Java應(yīng)用安全領(lǐng)域,Spring Security會成為被首先推崇的解決方案,就像我們看到服務(wù)器就會聯(lián)想到Linux一樣順理成章,需要的朋友可以參考下2023-07-07java判斷String類型是否能轉(zhuǎn)換為int的方法
今天小編就為大家分享一篇java判斷String類型是否能轉(zhuǎn)換為int的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題
這篇文章主要介紹了springboot使用rocketmq?RocketMQMessageListener參數(shù)問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值需要的朋友可以參考下2022-11-11