Android调用OCR识别图像中的文字
// CharacterExtractor.java
// Copyright (c) 2010 William Whitney
// All rights reserved.
// This software is released under the BSD license.
// Please see the accompanying LICENSE.txt for details.
package srtp.ys.ocrtest;
import java.util.logging.Level;
import java.util.logging.Logger;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Matrix;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
import android.widget.ImageView;
import android.app.*;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
/**
* Saves all the characters in an image to an output directory individually.
* @author William Whitney
*/
public class CharacterExtractor extends DocumentScannerListenerAdaptor
{
private DocumentScanner documentScanner = new DocumentScanner();
private int std_width;
private int std_height;
////////////////////////////////////////////////////////////////////
public void slice( int std_width, int std_height)
{
try
{
this.std_width = std_width;
this.std_height = std_height;
Bitmap img = BitmapFactory.decodeFile("/sdcard/test.bmp");
PixelImage pixelImage = new PixelImage(img);
pixelImage.toGrayScale(true); //OK
pixelImage.filter(); // OK
documentScanner.scan(pixelImage, this, 0, 0, pixelImage.width, pixelImage.height);
}
catch (Exception ex)
{
Logger.getLogger(CharacterExtractor.class.getName()).log(Level.SEVERE, null, ex);
}
}
////////////////////////////////////////////////////////////////////
public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidth ;
float scaleHeight;
//float scaleWidth = ((float) w / width);
if(height>width) {
scaleWidth = ((float) h / height);
scaleHeight = ((float) h / height);
}
else
{
scaleWidth = ((float) w / width);
scaleHeight = ((float) w / width);
}
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newBmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
//加上30*30白色背景
Bitmap mbmpTest = Bitmap.createBitmap(30,30, Config.RGB_565);
Canvas canvasTemp = new Canvas(mbmpTest);//给Canvas指定一个bitmap,之后就不是画到屏幕而是画到这个bitmap上
canvasTemp.drawColor(Color.WHITE);
Paint mPaint = new Paint();
mPaint.setColor(Color.WHITE);
canvasTemp.drawBitmap(newBmp,(((float)(30-newBmp.getWidth()))/2),(((float)(30-newBmp.getHeight()))/2),mPaint);//画到正中间
return mbmpTest;
}
public static Bitmap rgbtoGrayscale(Bitmap bmpOriginal) {
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
public void processChar(int x1, int y1, int x2, int y2, int rowY1, int rowY2)
{
try
{
int areaW = x2 - x1;
int areaH = y2 - y1;
//Extract the character
Bitmap fatherimage = BitmapFactory.decodeFile("/sdcard/test.bmp");
// Drawable characterImage=new BitmapDrawable(BitmapFactory.decodeFile("/sdcard/test.jpg"));
Bitmap bitmapcharacterImage = Bitmap.createBitmap(fatherimage,x1, y1, areaW, areaH);
Log.v("w","w:"+bitmapcharacterImage.getWidth()+"H:"+bitmapcharacterImage.getHeight());
Bitmap characterImage=zoomBitmap(bitmapcharacterImage,std_width,std_height);//缩放并添上背景
// 显示位图
BitmapDrawable bmpDraw=new BitmapDrawable(rgbtoGrayscale(characterImage));
mainactivity.iv2.setImageDrawable(bmpDraw);
// int[] testImgPixels = ImageUtils.getPixels(rgbtoGrayscale(characterImage), characterImage.getWidth( ), characterImage.getHeight( ));
// int[][] binerymerticx=ImageUtils.getSymbolMatrix(testImgPixels, 2);
int[] binerymerticxforcompare = ImageUtils.getbinarymatrix(rgbtoGrayscale(characterImage));
int countblackpoint=0;
for(int ii=0;ii<30;ii++)
for(int jj=0;jj<30;jj++)
if(binerymerticxforcompare[ii*30+jj]==1)
countblackpoint++;
if(countblackpoint<10)
{
System.out.println();
}
else
{
//此处进行比较并输出结果:
int i;
int j;
int maxequal=0;
int maxindex=0;
int count=0;
for(i=0;i<26;i++)
{
count=0;
for(j=0;j<900;j++)
{
if(model.CharacterModel1[j]==binerymerticxforcompare[j])
count++;
}
// System.out.print(count);
// System.out.print(" ");
if(count>maxequal)
{
maxequal=count;
maxindex=i;
}
}
int i2;
int j2;
int maxequal2=0;
int maxindex2=0;
int count2=0;
for(i2=0;i2<26;i2++)
{
count2=0;
for(j2=0;j2<900;j2++)
{
if(model2.CharacterModel2[i2][j2]==binerymerticxforcompare[j2])
count2++;
}
// System.out.print(count);
// System.out.print(" ");
if(count2>maxequal2)
{
maxequal2=count2;
maxindex2=i2;
}
}
char result;
if(maxequal>maxequal2)
result=(char)('A'+maxindex);
else
result=(char)('a'+maxindex2);
mainactivity.res+=result;
// System.out.print(result);
// System.out.println();
}
}
catch (Exception ex)
{
Logger.getLogger(CharacterExtractor.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static final Logger LOG = Logger.getLogger(CharacterExtractor.class.getName());
}
Android调用OCR识别图像中的文字的更多相关文章
- Zybo智能小车识别图像中的文字
智能小车识别图像中的文字 [TOC] 运行平台 这次的内容是基于Xilinx公司的Zybo开发板以及其配套的Zrobot套件开发 Zybo上面的sd卡搭载了Ubuntu12.04LTS的linux版本 ...
- 利用百度文字识别API识别图像中的文字
本文将会介绍如何使用百度AI开放平台中的文字识别服务来识别图片中的文字.百度AI开放平台的访问网址为:http://ai.baidu.com/ ,为了能够使用该平台提供的AI服务,你需要事先注册一 ...
- 使用 Python 识别并提取图像中的文字
1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...
- 利用Hough变换识别图像中的直线
引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...
- 【转】OCR识别引擎tesseract使用方法——安装leptonica和libtiff
原文来自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c4224 ...
- 使用Python进行OCR -- 识别图片中的文字
工具 Tesseract pytesseract tesserocr 朋友需要一个工具,将图片中的文字提取出来.我帮他在网上找了一些OCR的应用,都不好用.所以准备自己研究,写一个Web APP供他使 ...
- 如何大批量的识别图片上的文字,批量图片文字识别OCR软件系统
软件不需要安装,直接双击打开就可以用,废话不多说直接上图好了,方便说明问题 批量图片OCR(批量名片识别.批量照片识别等)识别,然后就下来研究了一下,下面是成果 使用步骤:打开单个图片识别,导入文件夹 ...
- 【Win10 应用开发】OCR识别
OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备( ...
- AI时代的OCR识别技术浅析
人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...
随机推荐
- 【Trie图】BZOJ3940-[Usaco2015 Feb]Censoring
[题目大意] 有一个匹配串和多个模式串,现在不断删去匹配串中的模式串,求出最后匹配串剩下的部分. [思路] 众所周知,KMP的题往往对应着一道AC自动机quq.本题同BZOJ3942(KMP),这里改 ...
- [CodeForces850C]Arpa and a game with Mojtaba
题目大意: 给你一个包含n个数的数列,两个人轮流对数列进行如下操作: 选择一个质数p和一个正整数k,将数列中所有能被p^k整除的数除以p^k. 最后不能操作者负. 问先手是否有必胜策略. 思路: 显然 ...
- Problem G: 切煎饼
Description 王小二自夸刀工不错,有人放一张大的圆煎饼在砧板上,问他:饼不允许离开砧板,切100刀最多能切多少块? Input 多组测试数据,每组输入1个整数,代表切的刀数 Output 每 ...
- noip2009最优贸易
试题描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- Java之多线程 Semaphore(信号量)
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- 参加SAP VT项目有感
凡事预则立,不预则废. 没有接到录取电话还是有些悲伤的,虽然知道最终被录取的可能性不大,但是之前还是抱着一丝期望的,毕竟是自己的处女面,就这么以失败的结果结束了. 从最开始的投递简历,到后来的电话面试 ...
- mybatis源码分析(6)-----核心调度对象StatmentHandler
写在前面 通过上一偏文章,我们知道:mybatis 的插件开发,主要是集中在Executor(执行器),ParameterHandler(参数处理器),ResultSetHandler(结果集处理器) ...
- maven,阿里云国内镜像,提高jar包下载速度
镜像 maven默认会从中央仓库下载jar包,这个仓库在国外,而且全世界的人都会从这里下载,所以下载速度肯定是非常慢的.镜像就相当于是中央仓库的一个副本,内容和中央仓库完全一样,目前有不少国内镜像,其 ...
- Spring JavaConfig @Import实例
一般来说, 需要按模块或类别 分割Spring XML bean文件 成多个小文件, 使事情更容易维护和模块化. 例如, <beans xmlns="http://www.spring ...
- C# 如何做类似微博和QQ的授权登录
记录下吧,dotnet下有这个http://dotnetopenauth.net/开源的框架可以用来实现服务端和客户端的实现,具体的使用方法还真研究,第一次接触OAuth这个概念