日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用Tessdata做OCR圖片文字識別的詳細(xì)思路

瀏覽:197日期:2023-02-08 14:51:39

說到文字識別,目前除了用一些現(xiàn)成的api,大概就是 tessdata、canvas或者 ocrad等。

1、百度接口用過(可以自己去百度開發(fā)者申請,免費(fèi)的),識別率吧,還可以,但也不是百分百的,但是次數(shù)使用有限制,雖然也是夠用,但是被限制總是害怕超過不讓用。2、canvas的話是需要對圖片做具體的處理,涉及到圖片的翻轉(zhuǎn)、置灰、文字間隔的設(shè)定等等,成功率很高,但是公司產(chǎn)品驗(yàn)證碼是各式各樣的,沒辦法用這種方法處理,所以暫時(shí)放棄了。3、ocrad這個(gè)目前用過其.js版本,識別率還是比較低的,具體使用后面會(huì)再寫一篇文章介紹一下的。雖然,網(wǎng)上對于 Tessdata的技術(shù)介紹文章一搜一大片,但是其實(shí)小仙真正用起來的時(shí)候,還是費(fèi)了點(diǎn)周折的。:fendou:

思路:截全圖–截取元素圖片–處理–識別–輸出

注意:圖片截取格式統(tǒng)一為.jpg,用png會(huì)出問題。

1、添加項(xiàng)目依賴

在項(xiàng)目的pom.xml文件中,添加以下依賴

<!--<tess4j圖片識別>--><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.1.0</version></dependency><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>2.0.1</version><exclusions><exclusion><groupId>com.sun.jna</groupId><artifactId>jna</artifactId></exclusion></exclusions></dependency>2、從全圖中截取元素圖片

// 元素截圖public static String[] elementscreenShot(WebElement element )throws Exception {WrapsDriver wrapsDriver = (WrapsDriver) element;long time = System.currentTimeMillis();// 截圖整個(gè)頁面File screen = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);BufferedImage img = ImageIO.read(screen);// 獲得元素的高度和寬度int width = element.getSize().getWidth();int height = element.getSize().getHeight();// 創(chuàng)建一個(gè)矩形使用上面的高度,和寬度Rectangle rect = new Rectangle(width, height);// 得到元素的坐標(biāo)Point p = element.getLocation();BufferedImage dest = img.getSubimage(p.getX(), p.getY(),(int) rect.getWidth(), (int) rect.getHeight());// 存為png格式ImageIO.write(dest, 'png', screen);DateFormat dateFormat = new SimpleDateFormat('yyyyMMddhhmmss');FileSystemView fsv = FileSystemView.getFileSystemView();File com = fsv.getHomeDirectory(); // 這便是讀取桌面路徑的方法了String url = com.getPath() + '/test';File location = new File(url);if (!location.exists()) {location.mkdirs();}String imgPath = location.getAbsolutePath() + File.separator + 'pic_'+ time + '.jpg';String cleanPath = location.getAbsolutePath();//存了原圖片和清楚后圖片的地址String[] imgpath = { imgPath, cleanPath };File targetFile = new File(imgPath);try {FileUtils.copyFile(screen, targetFile);} catch (IOException e1) {e1.printStackTrace();}//元素圖片路徑return imgpath;}3、對截取圖片進(jìn)行處理:灰度化、二值化、去除干擾線等

以下是圖像處理的類,其中對于去除干擾線的操作還是慎用,可能會(huì)把文字也剔除掉。

public class CleanElementImage { /** * * @param sfile * 需要去噪的圖像 * @param destDir * 去噪后的圖像保存地址 * @throws IOException */ public static void handlImage(File sfile, String destDir) throws IOException {File destF = new File(destDir);if (!destF.exists()){ destF.mkdirs();}BufferedImage bufferedImage = ImageIO.read(sfile);int h = bufferedImage.getHeight();int w = bufferedImage.getWidth();// 灰度化int[][] gray = new int[w][h];for (int x = 0; x < w; x++){ for (int y = 0; y < h; y++) {int argb = bufferedImage.getRGB(x, y);// 圖像加亮(調(diào)整亮度識別率非常高)int r = (int) (((argb >> 16) & 0xFF) * 1.1 + 30);int g = (int) (((argb >> 8) & 0xFF) * 1.1 + 30);int b = (int) (((argb >> 0) & 0xFF) * 1.1 + 30);if (r >= 255){ r = 255;}if (g >= 255){ g = 255;}if (b >= 255){ b = 255;}gray[x][y] = (int) Math.pow((Math.pow(r, 2.2) * 0.2973 + Math.pow(g, 2.2)* 0.6274 + Math.pow(b, 2.2) * 0.0753), 1 / 2.2); }}// 二值化int threshold = ostu(gray, w, h);BufferedImage binaryBufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);for (int x = 0; x < w; x++){ for (int y = 0; y < h; y++) {if (gray[x][y] > threshold) {gray[x][y] |= 0x00FFFF; } else {gray[x][y] &= 0xFF0000; } binaryBufferedImage.setRGB(x, y, gray[x][y]);} }//去除干擾線條//for(int y = 1; y < h-1; y++){// for(int x = 1; x < w-1; x++){//boolean flag = false ;//if(isBlack(binaryBufferedImage.getRGB(x, y))){// //左右均為空時(shí),去掉此點(diǎn)// if(isWhite(binaryBufferedImage.getRGB(x-1, y)) && isWhite(binaryBufferedImage.getRGB(x+1, y))){//flag = true;// }// //上下均為空時(shí),去掉此點(diǎn)// if(isWhite(binaryBufferedImage.getRGB(x, y+1)) && isWhite(binaryBufferedImage.getRGB(x, y-1))){//flag = true;// }// //斜上下為空時(shí),去掉此點(diǎn)// if(isWhite(binaryBufferedImage.getRGB(x-1, y+1)) && isWhite(binaryBufferedImage.getRGB(x+1, y-1))){//flag = true;// }// if(isWhite(binaryBufferedImage.getRGB(x+1, y+1)) && isWhite(binaryBufferedImage.getRGB(x-1, y-1))){//flag = true;// }// if(flag){//binaryBufferedImage.setRGB(x,y,-1);// }//}// }//} ImageIO.write(binaryBufferedImage, 'jpg', new File(destDir, sfile .getName()));}public static boolean isBlack(int colorInt){ Color color = new Color(colorInt); if (color.getRed() + color.getGreen() + color.getBlue() <= 300) {return true; } return false;}public static boolean isWhite(int colorInt){ Color color = new Color(colorInt); if (color.getRed() + color.getGreen() + color.getBlue() > 300) {return true; } return false;}public static int isBlackOrWhite(int colorInt){ if (getColorBright(colorInt) < 30 || getColorBright(colorInt) > 730) {return 1; } return 0;}public static int getColorBright(int colorInt){ Color color = new Color(colorInt); return color.getRed() + color.getGreen() + color.getBlue();}public static int ostu(int[][] gray, int w, int h){ int[] histData = new int[w * h]; // Calculate histogram for (int x = 0; x < w; x++) {for (int y = 0; y < h; y++){ int red = 0xFF & gray[x][y]; histData[red]++;} } // Total number of pixels int total = w * h; float sum = 0; for (int t = 0; t < 256; t++){sum += t * histData[t];} float sumB = 0; int wB = 0; int wF = 0; float varMax = 0; int threshold = 0; for (int t = 0; t < 256; t++) {wB += histData[t]; // Weight Backgroundif (wB == 0) { continue;}wF = total - wB; // Weight Foregroundif (wF == 0) { break;}sumB += (float) (t * histData[t]);float mB = sumB / wB; // Mean Backgroundfloat mF = (sum - sumB) / wF; // Mean Foreground// Calculate Between Class Variancefloat varBetween = (float) wB * (float) wF * (mB - mF) * (mB - mF);// Check if new maximum foundif (varBetween > varMax){ varMax = varBetween; threshold = t;} } return threshold;}}4、準(zhǔn)備識別的語言包

默認(rèn)是英文(識別字母和數(shù)字),如果要識別中文(數(shù)字 + 中文),需要制定語言包。語言包可以指定一個(gè)路徑,有就可以了。源碼下載地址可以下載源碼,然后到下面這個(gè)路徑找到語言包,把語言包放到一個(gè)路徑:例如:XXX/tessdata/下面。

tesseract.js-master.ziptesseract.js-mastertestsassetstraineddata

Java使用Tessdata做OCR圖片文字識別的詳細(xì)思路

5、對圖片進(jìn)行識別

/*** 圖片識別* @author wangy* @date 2019-08-26* @param parameter*/public static String ocrResult(WebElement element ) throws Exception {FileSystemView fsv = FileSystemView.getFileSystemView();File com=fsv.getHomeDirectory(); //這便是讀取桌面路徑的方法了String url = '';String os = System.getProperty('os.name');//識別系統(tǒng),找不同的語言包路徑if (os.indexOf('Windows') == -1) {url = '/opt/google/';} else {url = com.getPath();}//獲取元素截圖的路徑String path[]=Screenshot.elementscreenShot(element);//獲取未處理的截圖路徑String imgpath=path[0];String result = null;File imageFile = new File(imgpath);//要對圖片處理CleanElementImage.handlImage(imageFile,path[1]);ITesseract instance = new Tesseract();//讀取語言包的路徑地址instance.setDatapath(url + File.separator + 'test' + File.separator+ 'tessdata');// 默認(rèn)是英文(識別字母和數(shù)字),如果要識別中文(數(shù)字 + 中文),需要制定語言包,這里是數(shù)字,所以沒用語言包// instance.setLanguage('chi_sim');//為了防止沒截完圖片就識別,做了一個(gè)簡單的循環(huán)try{String ocrResult=instance.doOCR(imageFile);if(imageFile.exists()&&ocrResult!=''){result=ocrResult;}else {while(true){Thread.sleep(1000);if(imageFile.exists()&&ocrResult!=''){result=ocrResult;break;}}}}catch(TesseractException e){System.out.println(e.getMessage());}return result;}

這一部分由于項(xiàng)目問題,貼在這里做了特殊處理,原碼有一點(diǎn)點(diǎn)區(qū)別。大家使用,如果有什么問題,歡迎反饋!

6、成果

這里簡單放個(gè)對照,圖片將就看一下效果,識別結(jié)果大概90%以上吧:

Java使用Tessdata做OCR圖片文字識別的詳細(xì)思路

到此這篇關(guān)于Java使用Tessdata做OCR圖片文字識別的詳細(xì)思路的文章就介紹到這了,更多相關(guān)java Tessdata圖片文字內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久九九| 你懂的国产精品| 久久国产三级| 日韩精品五月天| 亚洲永久精品唐人导航网址| 巨乳诱惑日韩免费av| 香蕉成人av| 亚洲成人精品| 欧美日韩高清| 国产精品免费看| 亚洲一区二区三区久久久| 蜜臀a∨国产成人精品| 热久久久久久久| 亚洲精品乱码| 欧美日一区二区在线观看| 国产欧美日韩影院| 久久精品欧洲| 91视频精品| 91精品在线观看国产| 99国产精品免费视频观看| 99久久99久久精品国产片果冰 | 欧美自拍一区| 国产精品日韩精品在线播放| 久久免费精品| 免费在线小视频| 欧美精品一线| 免费在线观看成人| 日韩欧美激情电影| 国产亚洲一区| 成人午夜亚洲| 亚洲国内精品| 日韩精品视频中文字幕| 免费精品视频| 亚洲精品自拍| 婷婷六月综合| 国产精品久久久亚洲一区| 日韩av片子| 9色精品在线| 7777精品| 亚洲精品午夜av福利久久蜜桃| 欧美在线资源| 亚洲黄色中文字幕| 免费在线看一区| 国产精品毛片aⅴ一区二区三区| 在线视频亚洲欧美中文| 老牛影视一区二区三区| 丝袜亚洲精品中文字幕一区| 国产a久久精品一区二区三区| 日本午夜精品久久久久| 精品免费在线| 亚洲综合二区| 久久国产生活片100| 日韩大片在线| 婷婷五月色综合香五月| 日韩成人a**站| 蜜臀久久99精品久久久久久9| 欧美日韩一区二区三区不卡视频 | 久久久久一区| 国产欧美日韩精品一区二区三区| 国产亚洲综合精品| 日本va欧美va欧美va精品| 日韩88av| 久久精品国产网站| 精品三级久久久| 高清日韩欧美| 亚洲黑丝一区二区| 黑丝一区二区三区| 亚洲我射av| 欧美一区免费| 精品免费av在线| 鲁鲁在线中文| 国产亚洲毛片| 日韩国产欧美一区二区三区| 精品五月天堂| 欧美激情91| 精品一区不卡| 欧美日本精品| 亚洲一区欧美二区| 国产精品入口久久| 91国语精品自产拍| 国产精品嫩模av在线| 亚州av乱码久久精品蜜桃| 国产乱码精品一区二区三区亚洲人| 日韩一区二区三区免费| 国产精品毛片久久久| 亚洲深夜福利在线观看| 国产精品久久久久久av公交车| www.51av欧美视频| 午夜一级在线看亚洲| 亚洲免费影视| 免费在线观看一区二区三区| 中文字幕亚洲在线观看| 国产精品宾馆| 久久a爱视频| 日韩一区二区免费看| 国产精品2区| 亚洲精品亚洲人成在线观看| 韩国三级一区| 麻豆精品一区二区综合av| 国产一区白浆| 国产精品字幕| 免费看久久久| 日韩高清在线不卡| 久久国产精品毛片| 免费精品国产的网站免费观看| 国产剧情在线观看一区| 日本一区二区三区视频在线看| 午夜一级在线看亚洲| 欧美一区二区性| 欧美精选视频一区二区| 国产精品成人一区二区不卡| 国产精品magnet| 青草国产精品| 欧美在线看片| 日韩高清一区| 日韩激情网站| 奇米777国产一区国产二区| 日本麻豆一区二区三区视频| 91麻豆精品激情在线观看最新| 日韩av在线播放中文字幕| 亚洲狼人精品一区二区三区| 欧美国产精品| 日本综合视频| 精品久久97| 成人台湾亚洲精品一区二区| 久久中文字幕一区二区| 美女视频一区在线观看| 你懂的亚洲视频| 精品免费av| 国产精品美女久久久| 中文日韩在线| 日韩一区二区三区精品视频第3页| 久久久久国产精品一区二区| 国产精品对白| 欧美日韩在线观看首页| 国产精品2区| 久久精品欧洲| 中文一区一区三区高中清不卡免费| 国产精品三p一区二区| 日韩精彩视频在线观看| 中文字幕成人| 一区二区亚洲视频| 国产伊人精品| 91精品综合| 国产韩日影视精品| 久久中文视频| 三级小说欧洲区亚洲区| 国产欧美综合一区二区三区| 亚洲精品美女91| 免费视频久久| 99国产精品久久久久久久成人热 | 欧美美女一区| 在线看片日韩| 日韩高清不卡一区二区| 日韩久久一区| 秋霞影院一区二区三区| 日本久久成人网| 日韩高清不卡在线| 国产麻豆精品| 精品免费av在线| 日韩视频一区| 精品国产欧美日韩一区二区三区| 欧美在线亚洲综合一区| 久久国产电影| 国产精品一级在线观看| 国产日韩一区| 成人污污视频| 免费一二一二在线视频| 国产午夜久久| 成人国产精品一区二区网站| 国产一区二区三区四区五区传媒| 麻豆精品视频在线观看| 国产一区国产二区国产三区| 在线精品亚洲欧美日韩国产| 免费精品视频| 麻豆视频观看网址久久| 在线看片不卡| 午夜精品影院| 久久中文欧美| 国产一区日韩欧美| 久久一区二区三区电影| 婷婷亚洲成人| 天海翼亚洲一区二区三区| 亚洲91精品| 久久男女视频| 视频在线不卡免费观看| 久久高清一区| 日韩黄色在线观看| 国产精品一区二区精品| yellow在线观看网址| 国产91精品对白在线播放| 亚洲一区二区小说| 美女国产一区二区三区| 亚洲v在线看| 午夜欧美视频| 麻豆一区二区三区| 欧美日韩国产高清电影| 国产精品第一国产精品| 久久亚洲人体| 中文久久精品|