基于百度文字识别SDK开发自助车牌识别系统
这次的实验是完成身份证照片和车牌的识别功能,流程和上一次实验差不多,不同的就是对数据的处理形式和展示,以及对页面的布局重新调整了一下。
首先去百度智能云技术文档下,找到文字识别中的身份证识别技术文档,下载需要的4个类。分别是Base64Util.java,FileUtil.java,GsonUtis.java,HttpUtil.java,还有一个Access_token获取的类,这个在文档上也有,把它加入进去,然后就可以直接调用接口了,当然调用前需要先开通。
调用接口的类: 这里面包括俩个方法,分别是身份证识别和车牌识别,因为身份证可以看成key和value的值,所以把它存入hashMap中,车牌识别就返回一个简单的车牌号
public static HashMap<String,String> hashMap = new HashMap<>(); //身份证识别 public static void idcard(String filePath) { // 请求url String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"; try { // 本地文件路径 byte[] imgData = FileUtil.readFileByBytes(filePath); String imgStr = Base64Util.encode(imgData); String imgParam = URLEncoder.encode(imgStr, "UTF-8"); String param = "id_card_side=" + "front" + "&image=" + imgParam; // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = AccessToken.getAuth(); String result = HttpUtil.post(url, accessToken, param); //数据提取 JSONObject jsonObject = JSON.parseObject(result); String all = jsonObject.get("words_result").toString(); JSONObject jsonObject1 = JSON.parseObject(all); for(Entry<String, Object> object : jsonObject1.entrySet() ) { String key = object.getKey(); String values = object.getValue().toString(); JSONObject keyName = JSON.parseObject(values); String value = keyName.get("words").toString(); hashMap.put(key,value); } } catch (Exception e) { e.printStackTrace(); } } //车牌识别 public static String licensePlate(String filePath) { // 请求url String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate"; try { // 本地文件路径 byte[] imgData = FileUtil.readFileByBytes(filePath); String imgStr = Base64Util.encode(imgData); String imgParam = URLEncoder.encode(imgStr, "UTF-8"); String param = "image=" + imgParam; // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 //这是我自己定义的Access_token获取的方法,文档上有源码 String accessToken = AccessToken.getAuth(); String result = HttpUtil.post(url, accessToken, param); //json解析 JSONObject jsonObject = JSON.parseObject(result); String all = jsonObject.get("words_result").toString(); JSONObject jsonNumber = JSON.parseObject(all); String number = jsonNumber.get("number").toString(); return number; } catch (Exception e) { e.printStackTrace(); } return null; }
呈现结果的窗口类:
setLookAndFeel()函数就是一个窗口皮肤函数,想要生效就要导入jar包,不用也可以。
在显示身份证信息时,setText()无法识别换行符,但可以识别html,所以用拼接字符串形式,让数据换行显示。
public static String myFile; public static String[] type = new String[] {"身份证","车牌"}; public static String temp; public static void main(String[] args) { HashMap<String,String> hashMap = new HashMap<>(); setLookAndFeel(); AuthService authService = new AuthService(); //主窗体基本信息 JFrame j = new JFrame("文字识别系统"); j.setSize(1000, 800); j.setLocation(300, 50); j.setLayout(null); //下拉框选择查询类别 JLabel tishi = new JLabel("要识别图片的类型"); tishi.setBounds(280,20,200, 30); JComboBox<String> cb = new JComboBox<>(type); cb.setBounds(400, 20, 70, 30); //打开文件信息 JFileChooser jfc = new JFileChooser(); jfc.setFileFilter(new FileFilter() { @Override public String getDescription() { // TODO Auto-generated method stub return null; } @Override public boolean accept(File f) { // TODO Auto-generated method stub return true; } }); //图片容器 JLabel l = new JLabel(); //显示文字组件 JLabel jieguo = new JLabel("等待选择图片"); jieguo.setBounds(600, 150, 300, 300); //上传百度接口验证按钮 JButton jb2 = new JButton("上传网络验证"); jb2.setBounds(600, 350, 100, 50); //获取图片按钮 JButton jb1 = new JButton("上传图片"); jb1.setBounds(200, 350, 100, 50); jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub int returnVal = jfc.showOpenDialog(j); File file = jfc.getSelectedFile(); if (returnVal == JFileChooser.APPROVE_OPTION) { myFile = file.getAbsolutePath(); myFile.replaceAll("\\\\", "/"); ImageIcon i = new ImageIcon(myFile); l.setIcon(i); l.setBounds(50,50,i.getIconWidth(),i.getIconHeight()); jb1.setBounds(i.getIconWidth()/2, i.getIconHeight()+100, 100, 50); jb2.setBounds(i.getIconWidth()+100, 400, 100, 50); jieguo.setBounds(i.getIconWidth()+100, 150, 300, 300); } jieguo.setText("等待提交验证"); } }); jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub temp = cb.getSelectedItem().toString(); if(temp.equals("身份证")) { Interface.idcard(myFile); String outCome = "<html><body><p>经过网络识别,这个"+temp+"的信息是<br>"; for(String key : Interface.hashMap.keySet()) { String value = Interface.hashMap.get(key); outCome += key+":"+value+"<br>"; } outCome += "</p></body></html>"; jieguo.setText(outCome); Interface.hashMap.clear(); } else { String number = Interface.licensePlate(myFile); jieguo.setText("经过网络识别,这个"+temp+"的车牌号是"+number); } } }); j.add(tishi); j.add(cb); j.add(jieguo); j.add(l); j.add(jb1); j.add(jb2); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); j.setVisible(true); } private static void setLookAndFeel() { try { //javax.swing.UIManager.setLookAndFeel("com.birosoft.liquid.LiquidLookAndFeel"); //javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.mint.MintLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.aero.AeroLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.fast.FastLookAndFeel"); javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel"); // javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel"); } catch (Exception e) { e.printStackTrace(); // handle exception } }
结果演示: