java做图文识别

现在的世界,什么都需要人工智能AI进行处理,那么,对于Java程序猿来说,是不是有些工作是不是就不能胜任呢,答案是显然是不一定的,对于图片识别来说,这个任务就可以使用Java进行开发,虽然效率可能不是最好的,但是,结果是一致的。
下面我就开始出大招了
第一步,添加技能点
如果需要进行图片识别,那么肯定需要识别的插件或者是一个库呀,不然程序怎么清楚是识别那些东西,识别是中文还是英文,对不对,这个时候呢,就出现了“野怪”——ocr,给我们提供支持,从而进行升级添加技能点
什么事OCR,这个大家可以自行百度,其主要作用就是为我们进行识别图片中的文字的一个重要角色,下载方式直接百度tesseract下载就行
下载完成后,需要进行配置环境变量,我这也不进行过多描述,可以自行百度,如果需要,可后续追加一篇配置下载的博客说明
那么野怪位置找到了,我们就需要开始刷怪升级了
第二步,添加词库
需要识别文字,那么武器必不可少,如果没有装备,野怪也是能秒人的,所以,我们需要去下载一些词库,例如中文词库:chi_sim.traineddata,下载方式也可在百度上进行下载下来,下载完成后,在刚刚安装的tesseract下找到tessdata文件夹,将其复制过来就可以了,我的是D盘下,所以位置如下图
在这里插入图片描述
移动过来后,我们就有武器了,开始刷怪
第三步,开大,结束战斗(前方高能)

    public static String IdentifyThePicture(){
        //识别图片
        System.out.println("开始识别");
        long starttime = System.currentTimeMillis();
        //获取当前程序执行绝对路径。
        String text = orcde("normal", "D:\\tesseract-ocr\\tessdata", "D://JT//1.png");
        System.out.println("discriminate interval:" + (System.currentTimeMillis() - starttime) + ",ocr text:" + text);
        return text;
    }
public static String orcde(String lang, String langpath, String imageurl){
        // 识别图片的路径(修改为自己的图片路径)
        String path = imageurl;

        // 语言库位置(修改为跟自己语言库文件夹的路径)
        String lagnguagePath = langpath;

        File file = new File(path);
        ITesseract instance = new Tesseract();

        //设置训练库的位置
        instance.setDatapath(lagnguagePath);

        //chi_sim :简体中文, eng    根据需求选择语言库
        instance.setLanguage(lang);
        String result = null;
        try {
            long startTime = System.currentTimeMillis();
            result =  instance.doOCR(file);
            long endTime = System.currentTimeMillis();
            System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
        } catch (TesseractException e) {
            e.printStackTrace();
        }

        System.out.println("result: ");
        System.out.println(result);
       return result;
    }

运行结果如下:
在这里插入图片描述
图片中的内容如下:
在这里插入图片描述
你是不是发现有两个字不对,这个咱暂时不告诉你,请继续往下看
代码看起来是不是很简单,(你心里觉得是这样想的)因为这是有野怪,如果没有野怪怎么办,或者等级不够怎么办(1级单挑100级?)显然是不可以的,这个时候就需要进行训练了,训练啥,训练词库,怎么训练,如下:
第一步,下载jTessBoxEditor_jb51(找到新手训练营)
jTessBoxEditor_jb51这是啥东西,我告诉你,这个是训练词库必须要用的一个jar包,但是呢,他不是在项目里面使用的,而是独立运行的,怎么使用,待会就来
第二步,生产词条(找到野怪)
怎么生产词条,也就将你需要识别的一些文字,做成一个jpg的图片,怎么做,直接截图呗,然后保存为jpg就行了
是不是说好简单,还没完呢!
有了jpg图片后,需要对其改变格式,不能手动改变后缀,需要通过格式工厂,或者在线转换插件进行转换,将jpg的图片转换为tif的文件格式,然后启动我们的新手训练营jTessBoxEditor_jb51,(里面有一个启动脚本的了)
在这里插入图片描述
就是上面圈住的这个bat脚本,启动后,会出来一个Java窗口
在这里插入图片描述
先过去将刚刚的图片更改图片名字,这个是有要求的

tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言           fontname是字体
比如我们要训练自定义字库myfontlab      字体名normal
那么我们把图片文件重命名 myfontlab.normal.exp0.jpg在转tif。

在这里插入图片描述

这个时候呢,我们需要打开黑命令框(CMD)输入命令生成box文件

tesseract myfontlab.normal.exp0.jpg myfontlab.normal.exp0 -l chi_sim batch.nochop makebox

运行结果如图
在这里插入图片描述
然后就会产生一个新的文件在该文件夹下
在这里插入图片描述
这个时候就需要用的我们的jTessBoxEditor_jb51了,点击open,选择刚刚处理过得tif文件图片得到下面结果数据
在这里插入图片描述
在这里插入图片描述

然后开始修改我们不对的字第5行的窝应该是我,所以需要进修改,选择改行,
在这里插入图片描述
然后点击save进保存,这个时候就词条就生产完毕了需要导入到我们的词库中去

第三步,词条添加到词库中(捡装备了)
cmd中输入命令,生成.tr文件

tesseract  myfontlab.normal.exp0.jpg  myfontlab.normal.exp0  nobatch box.train

在这里插入图片描述
再输入命令,生成unicharset文件

unicharset_extractor myfontlab.normal.exp0.box

在这里插入图片描述

新建一个font_properties.txt文件
里面内容写入 normal 0 0 0 0 0 表示默认普通字体
运行命令

shapeclustering -F font_properties.txt -U unicharset myfontlab.normal.exp0.tr

在这里插入图片描述

mftraining -F font_properties.txt -U unicharset -O unicharset myfontlab.normal.exp0.tr

在这里插入图片描述

cntraining myfontlab.normal.exp0.tr

在这里插入图片描述
目录下会生成对应下列五个文件,在这五个文件前加上normal.进行重命名
在这里插入图片描述
合并五个文件,此时目录下的normal.traineddata 就是训练好的字库文件
执行 命令

combine_tessdata normal. 

在这里插入图片描述
最后就产生了一个新的文件,这就是刚刚训练出来的词库
在这里插入图片描述
最后将新的词库放人的OCR中就行了,怎么放,教你
把normal.traineddata 复制到Tesseract-OCRt程序目录下的“tessdata”目录,
在Tesseract-OCRt程序目录下执行

tesseract.exe myfontlab.normal.exp0.jpg out –l normal

在这里插入图片描述
这个时候,词库就好了,再运行一下试试
在这里插入图片描述
完美,图文识别成功

疯狂打架去吧,再也不用担心打不过了 ^_^

以上内容可能有不正确的地方,望大佬指正,如果需要下载配置介绍,欢迎评论去留言哦
附上pom文件依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.play</groupId>
    <artifactId>play</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>play</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--tesseract-platform里面包含了所有tesseract所需要的jar-->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>tesseract-platform</artifactId>
            <version>3.04.01-1.3</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.4.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

ImageComparerUI——基于Java语言实现的相似图像识别,基于直方图比较算法。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; public class ImageComparerUI extends JComponent implements ActionListener { /** * */ private static final long serialVersionUID = 1L; private JButton browseBtn; private JButton histogramBtn; private JButton compareBtn; private Dimension mySize; // image operator private MediaTracker tracker; private BufferedImage sourceImage; private BufferedImage candidateImage; private double simility; // command constants public final static String BROWSE_CMD = "Browse..."; public final static String HISTOGRAM_CMD = "Histogram Bins"; public final static String COMPARE_CMD = "Compare Result"; public ImageComparerUI() { JPanel btnPanel = new JPanel(); btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); browseBtn = new JButton("Browse..."); histogramBtn = new JButton("Histogram Bins"); compareBtn = new JButton("Compare Result"); // buttons btnPanel.add(browseBtn); btnPanel.add(histogramBtn); btnPanel.add(compareBtn); // setup listener... browseBtn.addActionListener(this); histogramBtn.addActionListener(this); compareBtn.addActionListener(this); mySize = new Dimension(620, 500); JFrame demoUI = new JFrame("Similiar Image Finder"); demoUI.getContentPane().setLayout(new BorderLayout()); demoUI.getContentPane().add(this, BorderLayout.CENTER); demoUI.getContentPane().add(btnPanel, BorderLayout.SOUTH); demoUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); demoUI.pack(); demoUI.setVisible(true); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; if(sourceImage != null) { Image scaledImage = sourceImage.getScaledInstance(300, 300, Image.SCALE_FAST); g2.drawImage(scaledImage, 0, 0, 300, 300, null); } if(candidateImage != null) { Image scaledImage = candidateImage.getScaledInstance(300, 330, Image.SCALE_FAST); g2.drawImage(scaledImage, 310, 0, 300, 300, null); } // display compare result info here Font myFont = new Font("Serif", Font.BOLD, 16); g2.setFont(myFont); g2.setPaint(Color.RED); g2.drawString("The degree of similarity : " + simility, 50, 350); } public void actionPerformed(ActionEvent e) { if(BROWSE_CMD.equals(e.getActionCommand())) { JFileChooser chooser = new JFileChooser(); chooser.showOpenDialog(null); File f = chooser.getSelectedFile(); BufferedImage bImage = null; if(f == null) return; try { bImage = ImageIO.read(f); } catch (IOException e1) { e1.printStackTrace(); } tracker = new MediaTracker(this); tracker.addImage(bImage, 1); // blocked 10 seconds to load the image data try { if (!tracker.waitForID(1, 10000)) { System.out.println("Load error."); System.exit(1); }// end if } catch (InterruptedException ine) { ine.printStackTrace(); System.exit(1); } // end catch if(sourceImage == null) { sourceImage = bImage; }else if(candidateImage == null) { candidateImage = bImage; } else { sourceImage = null; candidateImage = null; }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值