日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像文字识别(二):java调用tesseract 识别图片文字

發布時間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像文字识别(二):java调用tesseract 识别图片文字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 在JAVA中調用tesseract識別圖片的文字內容,主要有兩種方式:cmd方式,tess4j方式。在這篇博客中,主要記錄一下通過cmd命令行的方式。cmd方式,就是通過在java中調用命令行,來執行tesseract,它的原理就是上篇博客所寫的內容。

步驟:

(1)導入兩個jar包:jai_imageio-1.1.1.jar 和 swingx-1.6.1.jar

(2)編寫ImageIOHelper類,用于創建臨時圖片文件,防止損壞初始文件

import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Locale;import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream;import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam; /** * 類說明 :創建臨時圖片文件防止損壞初始文件 */ public class ImageIOHelper {//設置語言private Locale locale=Locale.CHINESE;//自定義語言構造的方法public ImageIOHelper(Locale locale){this.locale=locale;}//默認構造器Locale.CHINESEpublic ImageIOHelper(){}/*** 創建臨時圖片文件防止損壞初始文件* @param imageFile* @param imageFormat like png,jps .etc* @return TempFile of Image*/public File createImage(File imageFile, String imageFormat) throws IOException {//讀取圖片文件Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat); ImageReader reader = readers.next();//獲取文件流ImageInputStream iis = ImageIO.createImageInputStream(imageFile);reader.setInput(iis);IIOMetadata streamMetadata = reader.getStreamMetadata(); //設置writeParamTIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE); tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED); //設置可否壓縮 //獲得tiffWriter和設置outputIterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff"); ImageWriter writer = writers.next(); BufferedImage bi = reader.read(0); IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0)); File tempFile = tempImageFile(imageFile); ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile); writer.setOutput(ios); writer.write(streamMetadata, image, tiffWriteParam); ios.close();iis.close();writer.dispose(); reader.dispose(); return tempFile; } /*** 給tempfile添加后綴* @param imageFile* @throws IOException */private File tempImageFile(File imageFile) throws IOException { String path = imageFile.getPath(); StringBuffer strB = new StringBuffer(path); strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H"); //設置文件隱藏return new File(strB.toString()); } }

(3)創建OCRUtil工具類,用于進行圖片文字識別:

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Locale;import org.jdesktop.swingx.util.OS;/** * 類說明:OCR工具類 */ public class OCRUtil {private final String LANG_OPTION = "-l"; //英文字母小寫l,并非阿拉伯數字1 private final String EOL = System.getProperty("line.separator"); private String tessPath = "D://Tesseract//Tsseract-OCR//Tesseract-OCR";//ocr的安裝路徑public OCRUtil(String tessPath,String transFileName){this.tessPath=tessPath;}//OCRUtil的構造方法,默認路徑是"C://Program Files (x86)//Tesseract-OCR"public OCRUtil(){ }public String getTessPath() {return tessPath;}public void setTessPath(String tessPath) {this.tessPath = tessPath;}public String getLANG_OPTION() {return LANG_OPTION;}public String getEOL() {return EOL;}/*** @param 需要識別的文件* @param 文件的格式* @return 識別后的文字*/public String recognizeText(File imageFile,String imageFormat)throws Exception{ File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat); return ocrImages(tempImage, imageFile); } //可以自定義語言public String recognizeText(File imageFile,String imageFormat,Locale locale)throws Exception{ File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);return ocrImages(tempImage, imageFile);}/*** @param 臨時文件* @param 需要識別的文件* @return 識別后的內容* @throws IOException* @throws InterruptedException*/private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{//設置輸出文件的保存的文件目錄,以及文件名File outputFile = new File(imageFile.getParentFile(),"test");StringBuffer strB = new StringBuffer(); //設置命令行內容List<String> cmd = new ArrayList<String>(); if(OS.isWindowsXP()){ cmd.add(tessPath+"//tesseract"); }else if(OS.isLinux()){ cmd.add("tesseract"); }else{ cmd.add(tessPath+"//tesseract"); } cmd.add(""); cmd.add(outputFile.getName()); cmd.add(LANG_OPTION); cmd.add("chi_sim");//中文包cmd.add("equ");//常用數學公式包cmd.add("eng");//英語包//創建操作系統進程ProcessBuilder pb = new ProcessBuilder(); pb.directory(imageFile.getParentFile());//設置此進程生成器的工作目錄 cmd.set(1, tempImage.getName()); pb.command(cmd);//設置要執行的cmd命令 pb.redirectErrorStream(true);//設置后續子進程生成的錯誤輸出都將與標準輸出合并 long startTime = System.currentTimeMillis();System.out.println("開始時間:" + startTime);Process process = pb.start();//開始執行,并返回進程實例 //最終執行命令為:tesseract 1.png test -l chi_sim+equ+engint w = process.waitFor(); tempImage.delete();//刪除臨時正在工作文件 if(w==0){ // 0代表正常退出BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8")); String str; while((str = in.readLine())!=null){ strB.append(str).append(EOL); } in.close(); long endTime = System.currentTimeMillis();System.out.println("結束時間:" + endTime);System.out.println("耗時:" + (endTime - startTime) + "毫秒");}else{ String msg; switch(w){ case 1: msg = "Errors accessing files.There may be spaces in your image's filename."; break; case 29: msg = "Cannot recongnize the image or its selected region."; break; case 31: msg = "Unsupported image format."; break; default: msg = "Errors occurred."; } tempImage.delete(); throw new RuntimeException(msg); } new File(outputFile.getAbsolutePath()+".txt");//.delete(); return strB.toString().replaceAll("\\s*", ""); } }

(4)創建測試類Test:

import java.io.File; import java.io.IOException;/** * @version 創建時間:2018年4月25日 下午5:09:19 * 類說明:測試類 */ public class Test {public static void main(String[] args) {try {//圖片文件:此圖片是需要被識別的圖片路徑 File file = new File("C://Users//1_20180208150251_x4hzz//1.png");//String recognizeText = new OCRHelper().recognizeText(file);String recognizeText = new OCRUtil().recognizeText(file, "png");System.out.print(recognizeText + "\t");} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}} }

至此,只要傳入需要識別的圖片,就可以識別出圖片中的文字的內容了。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的图像文字识别(二):java调用tesseract 识别图片文字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。