600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Java调用百度OCR文字识别API实现图片文字识别软件

Java调用百度OCR文字识别API实现图片文字识别软件

时间:2020-04-23 12:20:58

相关推荐

Java调用百度OCR文字识别API实现图片文字识别软件

java_baidu_ocr

Java调用百度OCR文字识别API实现图片文字识别软件

这是一款小巧方便,强大的文字识别软件,由Java编写,配上了窗口界面

调用了百度ocr文字识别API 识别精度高。

完整项目放在GitHub:/Ymy214/java_baidu_ocr

更新日志

新的改变 OcrViewer 2.0 更新于 .1.18

我对OcrViewer进行了一些功能拓展与界面美化,除了标准的本地图片识别功能,我增加了如下几点新功能,帮助你更方便使用本工具,进而更好地识别图像中的文字:

全新的界面设计,将会带来全新的使用体验;在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的高亮样式进行展示; 增加了截图识别功能,你可以通过截取图片直接直接进行识别; 增加了图片预览功能,更加方便进行图文对比,减少容错; 增加了清除图片预览功能,可以清清除览的图片; 增加了重新识别等功能,如果不确定可以多次识别提高识别精确率;

下面是功能以及新界面展示

识别出师表.png

截图出师表 .png识别结果

识别代码.png

代码.png识别结果

识腾讯新闻弹窗.png

腾讯新闻弹窗.png识别结果

软件界面

Java源代码:

主窗口类 FileChooserOCR2.java

package baiduOcr;import java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Image;import java.awt.Toolkit;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.StringSelection;import java.awt.datatransfer.Transferable;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.util.HashMap;import javax.imageio.ImageIO;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import org.json.JSONArray;import org.json.JSONObject;import com.baidu.aip.ocr.AipOcr;@SuppressWarnings("serial")public class FileChooserOCR2 extends JFrame implements ActionListener{// 设置APPID/AK/SKpublic static final String appId = "15289864";public static final String apiKey = "j0pj5Y7HVElkLnmn2LEXKeyO";public static final String secretKey = "FKVbH7EBcGy4DIaqPnXcqE47eACzn2W7";AipOcr client = new AipOcr(appId, apiKey, secretKey);JButton open, re0, copy, screen, reset, reocr, b6;JPanel ocrPanel, pNorth, pSouth, pWest, pEast, pCenter, pCenterLeft, pCenterRight;JTextArea ocrText;JLabel previewLabel, printLabel;ImageIcon defaultPreviewImg;JScrollPane areaScroll;String filePath = "./img/preview.jpg";BufferedImage screenImage;// 用与子窗体给父窗体传值// 构造方法public FileChooserOCR2(){// 主面板ocrPanel = new JPanel();ocrPanel.setLayout(new BorderLayout());// 各个按钮open = new JButton("[选择图片>>>文字识别]");re0 = new JButton("清空");copy = new JButton("复制");screen = new JButton("[截图识别]");reset = new JButton("清除");reocr = new JButton("重识");b6 = new JButton("b6");// 设置各按钮字体open.setFont(new Font("宋体", Font.BOLD, 18));screen.setFont(new Font("宋体", Font.BOLD, 18));copy.setFont(new Font("宋体", Font.BOLD, 18));re0.setFont(new Font("宋体", Font.BOLD, 18));reset.setFont(new Font("宋体", Font.BOLD, 18));reocr.setFont(new Font("宋体", Font.BOLD, 18));b6.setFont(new Font("宋体", Font.BOLD, 18));// 图片预览标签以及状态提示标签defaultPreviewImg = new ImageIcon("./img/preview.jpg");previewLabel = new JLabel(defaultPreviewImg);printLabel = new JLabel("输出:");// 文本域ocrText = new JTextArea("输出内容。。。");ocrText.setEditable(true);ocrText.setVisible(true);ocrText.setFont(new Font("宋体", Font.BOLD, 18));// 各方位分面板pWest = new JPanel(new GridLayout(2, 0));pEast = new JPanel(new GridLayout(2, 2));pSouth = new JPanel(new GridLayout(0, 2));pCenter = new JPanel(new GridLayout(0, 2));pCenterLeft = new JPanel(new CardLayout());pCenterRight = new JPanel(new CardLayout());// 默认预览图片是否伸缩// previewImg.setImage(previewImg.getImage().getScaledInstance(340,// 466,Image.SCALE_DEFAULT));// previewLabel.setIcon(previewImg);//// 文本域的滚动条areaScroll = new JScrollPane(ocrText);// 设置横向滚动条始终开启// areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);// 设置垂直滚动条始终开启// areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);// 设置横向滚动条自动(有需要时)开启areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);// 设置垂直滚动条自动(有需要时)开启areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);// 添加监听open.addActionListener(this);re0.addActionListener(this);copy.addActionListener(this);screen.addActionListener(this);reset.addActionListener(this);reocr.addActionListener(this);// 各组件依次加入相应方位面板pCenterLeft.add(previewLabel);// pCenterRight.add(ocrText);pCenterRight.add(areaScroll);pWest.add(reocr);pWest.add(reset);pSouth.add(screen);pSouth.add(printLabel);pCenter.add(pCenterLeft);pCenter.add(pCenterRight);pEast.add(copy);pEast.add(re0);// 各方位面板加入主面板ocrPanel.add(open, BorderLayout.NORTH);ocrPanel.add(pWest, BorderLayout.WEST);ocrPanel.add(pEast, BorderLayout.EAST);ocrPanel.add(pCenter, BorderLayout.CENTER);ocrPanel.add(pSouth, BorderLayout.SOUTH);ocrPanel.setSize(300, 300);this.add(ocrPanel);this.setBounds(400, 200, 900, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}@Overridepublic void actionPerformed(ActionEvent e){if (e.getSource() == re0){ocrText.setText("已清空内容。。。");printLabel.setText("输出:已清空内容。。。");}if (e.getSource() == copy){String jianqieban = ocrText.getText();setSysClipboardText(jianqieban);printLabel.setText("输出:已复制到剪贴板。。。");}if (e.getSource() == screen){new ScreenShotTest(this);// 现已实现为截屏功能, 截屏功能已经封装到一个类文件中,参考的代码}if (e.getSource() == reocr){ocrText.setText(imgOcr(filePath));printLabel.setText("输出:已重新识别。。。");}if (e.getSource() == reset){previewLabel.setIcon(defaultPreviewImg);filePath = "./img/preview.jpg";printLabel.setText("输出:已清除预览。。。");}if (e.getSource() == open){printLabel.setText("输出:选择文件。。。");System.out.println(e.getSource());// TODO Auto-generated method stubJFileChooser jfc = new JFileChooser();jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);jfc.showDialog(new JLabel(), "选择");File file = jfc.getSelectedFile();if (file.isDirectory()){System.out.println("(选择目录) $ " + file.getAbsolutePath());System.out.println("请选择图片。。。");} else if (file.isFile()){filePath = file.getAbsolutePath();ImageIcon ocrImg = new ImageIcon(filePath);System.out.println("(选择文件) $ " + filePath);ocrText.setText("正在识别。。。");// 缩放后的图片,用到了一个图片缩放算法ocrImg.setImage(ocrImg.getImage().getScaledInstance(340, 470, Image.SCALE_DEFAULT));previewLabel.setIcon(ocrImg);String ocrStr = imgOcr(filePath);printLabel.setText("输出:正在识别。。。");ocrText.setText(ocrStr);printLabel.setText("输出:识别完毕!!!。。。");}System.out.println("正在识别>>>" + jfc.getSelectedFile().getName());}}// 复制到剪贴板的方法public static void setSysClipboardText(String writeMe){Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();Transferable tText = new StringSelection(writeMe);clip.setContents(tText, null);}// 主方法public static void main(String[] args){FileChooserOCR2 ocrWin = new FileChooserOCR2();ocrWin.setVisible(true);}/** 文字识别方法*/public String imgOcr(String imgpath){// 传入可选参数调用接口HashMap<String, String> options = new HashMap<String, String>();options.put("language_type", "CHN_ENG");options.put("detect_direction", "true");options.put("detect_language", "true");options.put("probability", "true");// 参数为本地路径JSONObject res = client.basicGeneral(imgpath, options);// 解析json-------------JSONArray wordsResult = (JSONArray) res.get("words_result");String ocrStr = "\n";for (Object obj : wordsResult){JSONObject jo = (JSONObject) obj;ocrStr += jo.getString("words") + "\n";}// 解析json-------------return ocrStr;// return res.toString(2);}/** 文字识别方法(方法的重载)*/public String imgOcr(byte[] imgInbyte){// 传入可选参数调用接口HashMap<String, String> options = new HashMap<String, String>();options.put("language_type", "CHN_ENG");options.put("detect_direction", "true");options.put("detect_language", "true");options.put("probability", "true");// 参数为二进制数组JSONObject res = client.basicGeneral(imgInbyte, options);// 解析json-------------JSONArray wordsResult = (JSONArray) res.get("words_result");String ocrStr = "\n";for (Object obj : wordsResult){JSONObject jo = (JSONObject) obj;ocrStr += jo.getString("words") + "\n";}// 解析json-------------return ocrStr;// return res.toString(2);}}

截图窗口类 ScreenShotTest.java(参考自:/article/48968.htm)

package baiduOcr;import java.awt.AWTException;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.image.BufferedImage;import java.awt.image.RescaleOp;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.imageio.ImageIO;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JToolBar;import javax.swing.JWindow;import javax.swing.filechooser.FileNameExtensionFilter;import javax.swing.filechooser.FileSystemView;public class ScreenShotTest{private FileChooserOCR2 superWindow;public ScreenShotTest(FileChooserOCR2 superWimdow){this.superWindow = superWimdow;EventQueue.invokeLater(new Runnable() {@Overridepublic void run(){try{new ScreenShotWindow(superWindow);} catch (AWTException e){e.printStackTrace();}}});}}/** 截图窗口*/class ScreenShotWindow extends JWindow{private int orgx, orgy, endx, endy;private BufferedImage image = null;private BufferedImage tempImage = null;private BufferedImage saveImage = null;private ToolsWindow tools = null;private FileChooserOCR2 superWin;public ScreenShotWindow(FileChooserOCR2 superWindow) throws AWTException{this.superWin = superWindow;// 获取屏幕尺寸Dimension d = Toolkit.getDefaultToolkit().getScreenSize();this.setBounds(0, 0, d.width, d.height);// 截取屏幕Robot robot = new Robot();image = robot.createScreenCapture(new Rectangle(0, 0, d.width, d.height));this.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e){// 鼠标松开时记录结束点坐标,并隐藏操作窗口orgx = e.getX();orgy = e.getY();if (tools != null){tools.setVisible(false);}}@Overridepublic void mouseReleased(MouseEvent e){// 鼠标松开时,显示操作窗口if (tools == null){tools = new ToolsWindow(ScreenShotWindow.this, e.getX(), e.getY());} else{tools.setLocation(e.getX(), e.getY());}tools.setVisible(true);tools.toFront();}});this.addMouseMotionListener(new MouseMotionAdapter() {@Overridepublic void mouseDragged(MouseEvent e){// 鼠标拖动时,记录坐标并重绘窗口endx = e.getX();endy = e.getY();// 临时图像,用于缓冲屏幕区域放置屏幕闪烁Image tempImage2 = createImage(ScreenShotWindow.this.getWidth(), ScreenShotWindow.this.getHeight());Graphics g = tempImage2.getGraphics();g.drawImage(tempImage, 0, 0, null);int x = Math.min(orgx, endx);int y = Math.min(orgy, endy);int width = Math.abs(endx - orgx) + 1;int height = Math.abs(endy - orgy) + 1;// 加上1防止width或height0g.setColor(Color.BLUE);g.drawRect(x - 1, y - 1, width + 1, height + 1);// 减1加1都了防止图片矩形框覆盖掉saveImage = image.getSubimage(x, y, width, height);g.drawImage(saveImage, x, y, null);ScreenShotWindow.this.getGraphics().drawImage(tempImage2, 0, 0, ScreenShotWindow.this);}});this.setVisible(true);}@Overridepublic void paint(Graphics g){RescaleOp ro = new RescaleOp(0.8f, 0, null);tempImage = ro.filter(image, null);g.drawImage(tempImage, 0, 0, this);}// 保存图像到文件public void saveImage() throws IOException{// 先隐藏窗口后台执行,显得程序执行很快this.setVisible(false);tools.setVisible(false);JFileChooser jfc = new JFileChooser();jfc.setDialogTitle("保存");// 文件过滤器,用户过滤可选择文件FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG", "jpg");jfc.setFileFilter(filter);// 初始化一个默认文件(此文件会生成到桌面上)SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");String fileName = sdf.format(new Date());File filePath = FileSystemView.getFileSystemView().getHomeDirectory();File defaultFile = new File(filePath + File.separator + fileName + ".jpg");jfc.setSelectedFile(defaultFile);int flag = jfc.showSaveDialog(this);if (flag == JFileChooser.APPROVE_OPTION){File file = jfc.getSelectedFile();String path = file.getPath();// 检查文件后缀,放置用户忘记输入后缀或者输入不正确的后缀if (!(path.endsWith(".jpg") || path.endsWith(".JPG"))){path += ".jpg";}// 写入文件superWin.printLabel.setText("输出:已保存截图!!!");ImageIO.write(saveImage, "jpg", new File(path));dispose();}}// 返回截取的图片public void okImage(){this.setVisible(false);tools.setVisible(false);superWin.printLabel.setText("输出:识别截图成功!!!");ByteArrayOutputStream baos = null;try{baos = new ByteArrayOutputStream();ImageIO.write(saveImage, "jpg", baos);byte[] imageInByte = baos.toByteArray();// 使用toByteArray()方法转换成字节数组superWin.ocrText.setText(superWin.imgOcr(imageInByte));baos.flush();// 会产生IOException异常} catch (IOException e1){e1.printStackTrace();} finally{try{if (baos != null){baos.close();}} catch (Exception ex){ex.printStackTrace();}}dispose();}/** 文字识别方法(方法的重载) 用父窗口类的*//** 文字识别方法*/}/** 操作窗口*/class ToolsWindow extends JWindow implements ActionListener{private ScreenShotWindow parent;JButton saveButton, closeButton, okButton;public ToolsWindow(ScreenShotWindow parent, int x, int y){this.parent = parent;this.setLayout(new BorderLayout());JToolBar toolBar = new JToolBar("Java 截图");// 保存按钮saveButton = new JButton("◰");// 关闭按钮closeButton = new JButton("✘");// 选定按钮okButton = new JButton("✔");saveButton.addActionListener(this);closeButton.addActionListener(this);okButton.addActionListener(this);toolBar.add(saveButton);toolBar.add(closeButton);toolBar.add(okButton);this.add(toolBar, BorderLayout.NORTH);this.setLocation(x, y);this.pack();this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){// TODO Auto-generated method stubif (e.getSource() == saveButton){try{parent.saveImage();dispose();} catch (IOException e1){e1.printStackTrace();}}if (e.getSource() == closeButton){parent.dispose();dispose();// System.exit(0);}if (e.getSource() == okButton){// 返回选定的图片parent.okImage();dispose();}}}

↑↑↑↑↑↑↑↑↑↑↑↑以上为.1.18日OcrViewer2.0第二代↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

↓↓↓↓↓↓↓↓↓↓↓↓以下为.1.12日OcrViewer1.0第一代↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

打包生成了jar可执行程序

完整项目GitHub地址 新人有帮助有用的话请给个star谢谢了!

/Ymy214/java_baidu_ocr

识别图一

图一识别结果

识别图二

图二识别结果

识别图三

图三识别结果

软件界面

Java源代码:

package baiduOcr;import java.awt.BorderLayout;import java.awt.Font;import java.awt.Toolkit;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.StringSelection;import java.awt.datatransfer.Transferable;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import java.util.HashMap;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import org.json.JSONArray;import org.json.JSONObject;import com.baidu.aip.ocr.AipOcr;@SuppressWarnings("serial")public class FileChooserOCR extends JFrame implements ActionListener{// 设置APPID/AK/SKpublic static final String appId = "15289864";public static final String apiKey = "j0pj5Y7HVElkLnmn2LEXKeyO";public static final String secretKey = "FKVbH7EBcGy4DIaqPnXcqE47eACzn2W7";AipOcr client = new AipOcr(appId, apiKey, secretKey);JButton open, b1, b2, b3;JPanel ocrPanel;JTextArea ocrText;JScrollPane areaScroll;// 构造方法public FileChooserOCR(){ocrPanel = new JPanel();ocrPanel.setLayout(new BorderLayout());open = new JButton("选择图片>>>文字识别");b1 = new JButton("清空");b2 = new JButton("复制");b3 = new JButton("配置");open.setFont(new Font("宋体", Font.BOLD, 18));b3.setFont(new Font("宋体", Font.BOLD, 18));b2.setFont(new Font("宋体", Font.BOLD, 18));b1.setFont(new Font("宋体", Font.BOLD, 18));//文本域的滚动条//areaScroll = new JScrollPane(ocrText);//areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//添加监听open.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);ocrText = new JTextArea("输出内容。。。");ocrText.setEditable(true);ocrText.setVisible(true);ocrText.setFont(new Font("宋体", Font.BOLD, 18));ocrPanel.add(open, BorderLayout.NORTH);ocrPanel.add(b1, BorderLayout.EAST);ocrPanel.add(b2, BorderLayout.WEST);ocrPanel.add(b3, BorderLayout.SOUTH);ocrPanel.add(ocrText, BorderLayout.CENTER);//ocrPanel.add(areaScroll);ocrPanel.setSize(300, 300);this.add(ocrPanel);this.setBounds(400, 200, 900, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}@Overridepublic void actionPerformed(ActionEvent e){if(e.getSource()==b1){ocrText.setText("已清空内容。。。");}if(e.getSource()==b2){String jianqieban = ocrText.getText();setSysClipboardText(jianqieban);}if (e.getSource()==b3){//日后实现}if(e.getSource()==open){System.out.println(e.getSource());// TODO Auto-generated method stubJFileChooser jfc = new JFileChooser();jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);jfc.showDialog(new JLabel(), "选择");File file = jfc.getSelectedFile();if (file.isDirectory()){System.out.println("(选择目录) $ " + file.getAbsolutePath());System.out.println("请选择图片。。。");} else if (file.isFile()){System.out.println("(选择文件) $ " + file.getAbsolutePath());ocrText.setText("正在识别。。。");String ocrStr = this.imgOcr(file.getAbsolutePath());ocrText.setText(ocrStr);}System.out.println("正在识别>>>"+jfc.getSelectedFile().getName());}}//复制到剪贴板public static void setSysClipboardText(String writeMe) {Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable tText = new StringSelection(writeMe); clip.setContents(tText, null); } // 主方法public static void main(String[] args){FileChooserOCR ocrWin = new FileChooserOCR();ocrWin.setVisible(true);}/** 文字识别方法*/public String imgOcr(String imgpath){// 传入可选参数调用接口HashMap<String, String> options = new HashMap<String, String>();options.put("language_type", "CHN_ENG");options.put("detect_direction", "true");options.put("detect_language", "true");options.put("probability", "true");// 参数为本地路径JSONObject res = client.basicGeneral(imgpath, options);//解析json-------------JSONArray wordsResult = (JSONArray)res.get("words_result");String ocrStr = "\n";for(Object obj : wordsResult){JSONObject jo = (JSONObject)obj;ocrStr += jo.getString("words") + "\n";}//解析json-------------return ocrStr;// return res.toString(2);// 参数为二进制数组// byte[] file = readFile("test.jpg");// res = client.basicGeneral(file, options);// System.out.println(res.toString(2));// 通用文字识别, 图片参数为远程url图片// JSONObject res = client.basicGeneralUrl(url, options);// System.out.println(res.toString(2));}}

完整项目放在GitHub:/Ymy214/java_baidu_ocr

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。