Java基于百度API接口实现智慧文字识别

在这里插入图片描述

Java调用百度API实现在线文字识别

相信很多小伙伴对文字识别这种有点神奇的东东很感兴趣,很多人都想自己开发一个自己的文字识别工具供自己使用,那么,别着急,你只需要耐心的看完本文你就可以自己做一个文字识别工具啦!来,上碗面,额…呸,不对,上画面!

在这里插入图片描述
是不是有点那个意思,好啦,废话不多讲,我们一起来学习一下怎么制作的吧!

在这里插入图片描述
首先,别着急,我们先来看一下整个demo的开发流程:
在这里插入图片描述

来介绍一下实现开发部分:

首先,实现开发正如图中所示,我们是要实现图片识别,在很多版本的demo
中,大多数都是实现单一路径的图片识别,就是写死了path(图片的
path),这样在实际的应用场景是不可取的,所以本文介绍采用截图的方
式,直接读取截图后复制到剪切板的图片的数据,直接读取这个数据然后反
馈到百度的API实现类里面进行数据解析,读取文字,从而实现文字识别,而且对截图的照片进行存储操作,使用随机数算法生成随机数来命名文件,这样,使得不同的文件有不同的的名字,区分度高!以上就是本项目的思想核心,也是本项目与其他项目有所不同之处。这个需求是由于实际的应用场景的(比如截图直接获取文本,截图多次,获取多次,而不是截一次图运行一次程序,这样浪费时间,不如直接qq文字识别。)

在这里插入图片描述

好了,熟悉了整个的开发流程,那么,接下来,就是到了开发环节啦!giao!开始制作自己的百度AI在线智慧文字识别小工具!!!
在这里插入图片描述

首先是获取QQ截图后的复制到剪切板的图片的java类:

咳咳,我知道qq截图可以自己文字识别,但是我这里强调的是自己开发奥,吃瓜的小伙伴们不要误解了。。。。。

package com.sinsy.fntp;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sinsy.fntp.*;
public class savaimage {
//	设置一个路径
//	String path="";
	public static String getpath (){
		 String Image_path=null;
		try {
			//获取粘贴板图片
			Image image = savaimage.getImageFromClipboard();
			Randomui randompath=new Randomui();
			
			File file= new File("D:\\"+randompath.suijishu().get(0)+randompath.suijishu().get(1)+randompath.suijishu().get(2)+randompath.suijishu().get(3)+".jpg");
			//转成jpg
			BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
			//转成png
//			BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
			Graphics2D g = bufferedImage.createGraphics();
			g.drawImage(image, null, null);
			ImageIO.write((RenderedImage)bufferedImage, "jpg", file);
//			ImageIO.write((RenderedImage)bufferedImage, "png", file);
			Image_path=file.getPath();
 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Image_path;
	}
	
	
	/**
	 * 从剪切板获得文字。
	 */
	public static String getSysClipboardText() {
		String ret = "";
		Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
		// 获取剪切板中的内容
		Transferable clipTf = sysClip.getContents(null);
		
		if (clipTf != null) {
			// 检查内容是否是文本类型
			if (clipTf.isDataFlavorSupported(DataFlavor.stringFlavor)) {
				try {
					ret = (String) clipTf
							.getTransferData(DataFlavor.stringFlavor);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
 
		return ret;
	}
 
	/**
	 * 将字符串复制到剪切板。
	 */
	public static void setSysClipboardText(String writeMe) {
		Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable tText = new StringSelection(writeMe);
		clip.setContents(tText, null);
	}
 
	/**
	 * 从剪切板获得图片。
	 */
	public static Image getImageFromClipboard() throws Exception {
		Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable cc = sysc.getContents(null);
		if (cc == null)
			return null;
		else if (cc.isDataFlavorSupported(DataFlavor.imageFlavor))
			return (Image) cc.getTransferData(DataFlavor.imageFlavor);
		return null;
	}
 
	/**
	 * 复制图片到剪切板。
	 */
	public static void setClipboardImage(final Image image) {
		Transferable trans = new Transferable() {
			public DataFlavor[] getTransferDataFlavors() {
				return new DataFlavor[] { DataFlavor.imageFlavor };
			}
 
			public boolean isDataFlavorSupported(DataFlavor flavor) {
				return DataFlavor.imageFlavor.equals(flavor);
			}
 
			public Object getTransferData(DataFlavor flavor)
					throws UnsupportedFlavorException, IOException {
				if (isDataFlavorSupported(flavor))
					return image;
				throw new UnsupportedFlavorException(flavor);
			}
 
		};
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
				null);
	}
}

其次是用于保存截图的图片的随机数命名的Java类:

package com.sinsy.fntp;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;
public class Randomui {
	public static void main(String[] args) {
//		返回一个随机数
		System.out.println(suijishu().get(0));
	}
		static ArrayList<Integer> suijishu() {
			ArrayList<Integer> GD=new ArrayList<Integer>();
			 ArrayList<Integer> SCX=new ArrayList<Integer>();
	       for(int a=0;a<11;a++){
	           GD.add(a);
//	           System.out.print(a+"  ");
	       }
//	       System.out.println();
	       for(int b=0;b<4;b++){
	           Random r=new Random();
	             int a=r.nextInt(GD.size());
//	             [0,11)个伪随机数
//	             System.out.print(GD.get(a)+","); 
	             SCX.add(GD.get(a));
	             GD.remove(a);
	       }
//	       System.out.println();
	       return SCX;
		}
}


再就是AI识别类Java(这是主角)

package com.sinsy.fntp;

import java.util.HashMap;
import com.sinsy.fntp.*;
import org.json.JSONObject;

import com.baidu.aip.ocr.AipOcr;

public class aiscan {
	  //设置APPID/AK/SK
    public static final String APP_ID = "XXXXXXX";
    public static final String API_KEY = "XXXXXXXXXXX";
    public static final String SECRET_KEY = "XXXXXXXXXXXXX";

    public static void ceshi() {
        // 初始化一个AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

        // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
        // 也可以直接通过jvm启动参数设置此环境变量
//    System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");

        // 调用接口
//        设置一个连接地址(path)
    	savaimage image_path = new savaimage();
        String path = image_path.getpath();
        JSONObject res = client.basicGeneral(path, new HashMap<String, String>());
//        保存读取结果:
        String result = res.toString(2);
        System.out.println(res.toString(2));
        System.out.println(res.toString());
    }
    
}

最后就是可视化的类:

package com.sinsy.fntp;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.sinsy.fntp.*;
import javax.swing.JButton;
import javax.swing.JFrame;

public class view extends JFrame {
			String view_name="百度AI智能识别";
			public view() {
				// TODO Auto-generated constructor stub
				JFrame jf = new JFrame(view_name);  
				Container conn = jf.getContentPane(); 
				 JButton B1 = new JButton("点击开始识别");    
				 B1.setVisible(true);
				 conn.add(B1);
				 conn.setVisible(true);
				 jf.setVisible(true);
				 B1.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
						aiscan yu = new aiscan();
						yu.ceshi();
						}
					});
			}
}

最后,写一个测试类,就ok啦!

package com.sinsy.fntp;
import com.sinsy.fntp.*;
public class test {
public static void main(String[] args) {
	view yu = new view();
}
}

最后,再来看一下效果吧!(UI没有美化奥,制作简易,但是旨在功能实现!)
在这里插入图片描述
感谢各位小伙伴的支持与鼓励,本期鑫软fntp教程到此结束啦!下次在带给大家一下好玩的东东!观众老爷们,喜欢我的博客,记得点个赞,加个关注吧,评论支持一下吧,蟹蟹!祝你们java学得好,工资拿得高!(滑稽护体)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44085593/article/details/105741523
今日推荐