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 = "19581804";
public static final String API_KEY = "ry2etHjmOAKcGWCfbLvexxnE";
public static final String SECRET_KEY = "nVrDmSxlBN7GGeKHMN5N7EVY0YUmHp5f";
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学得好,工资拿得高!(滑稽护体)
转载:https://blog.csdn.net/weixin_44085593/article/details/105741523