// 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识别图像中的文字的更多相关文章

  1. Zybo智能小车识别图像中的文字

    智能小车识别图像中的文字 [TOC] 运行平台 这次的内容是基于Xilinx公司的Zybo开发板以及其配套的Zrobot套件开发 Zybo上面的sd卡搭载了Ubuntu12.04LTS的linux版本 ...

  2. 利用百度文字识别API识别图像中的文字

      本文将会介绍如何使用百度AI开放平台中的文字识别服务来识别图片中的文字.百度AI开放平台的访问网址为:http://ai.baidu.com/ ,为了能够使用该平台提供的AI服务,你需要事先注册一 ...

  3. 使用 Python 识别并提取图像中的文字

    1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...

  4. 利用Hough变换识别图像中的直线

    引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...

  5. 【转】OCR识别引擎tesseract使用方法——安装leptonica和libtiff

    原文来自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c4224 ...

  6. 使用Python进行OCR -- 识别图片中的文字

    工具 Tesseract pytesseract tesserocr 朋友需要一个工具,将图片中的文字提取出来.我帮他在网上找了一些OCR的应用,都不好用.所以准备自己研究,写一个Web APP供他使 ...

  7. 如何大批量的识别图片上的文字,批量图片文字识别OCR软件系统

    软件不需要安装,直接双击打开就可以用,废话不多说直接上图好了,方便说明问题 批量图片OCR(批量名片识别.批量照片识别等)识别,然后就下来研究了一下,下面是成果 使用步骤:打开单个图片识别,导入文件夹 ...

  8. 【Win10 应用开发】OCR识别

    OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备( ...

  9. AI时代的OCR识别技术浅析

    人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...

随机推荐

  1. Spring整合Mybatis案例,献给初学的朋友

    今天我们来学习Spring整合Mybatis. 开发环境:Ide:MyEclipse 2017 CI JDK:1.8 首先我们简单的认识下这两个框架 1.Mybatis MyBatis是一个支持普通S ...

  2. Navicat连接Docker中的mysql报错:client does not support authentication

    1.进入mysql容器中 docker exec -it mysqltest(mysql容器名称) bash 2.进入mysql数据库 mysql -uroot -p 3.输入mysql密码 4.远程 ...

  3. 01-项目简介Springboot简介入门配置项目准备

    总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...

  4. ACM -- 算法小结(八)字符串算法之Manacher算法

    字符串算法 -- Manacher算法 首先介绍基础入门知识,以下这部分来着一贴吧,由于是很久之前看的,最近才整理一下,发现没有保存链接,请原创楼主见谅. //首先:大家都知道什么叫回文串吧,这个算法 ...

  5. 一次经典的tcp三次握手

    TCP报头 在三次握手中使用的字段: 32位序列号 seq:表示的是本次报文发送的数据的第一个字节的序号. 32位确认号:ack  表示期望下一次应该接受到的报文的第一个字节的序号,若ack = N则 ...

  6. [转]MinGW编译wxWidgets问题

    其实利用MinGW编译wxWidgets是一件挺简单的事情,但是最近在编译的时候遇到一些问题,并找到解决方案,因此在此分享一下个人经验.编译出错的原因是由于安装了MSYS的缘故.   错误信息类似于如 ...

  7. HDFS API基本操作

    对HDFS API基本操作都是通过 org.apache.hadoop.fs.FileSystem类进行的,以下是一些常见的操作: package HdfsAPI; import java.io.Bu ...

  8. ADC In An FPGA

    http://davidkessner.wordpress.com/2011/05/01/adc-in-an-fpga/ Geek Alert!  What follows is very techn ...

  9. BOOST Converter Analog/Digital Adjusted Output Voltage TPS61045 MAX1932

    DIGITALLY ADJUSTABLE BOOST CONVERTER The TPS61045 is a high frequency boost converter with digitally ...

  10. Struts2的ActionError&ActionMessage示例

    本教程显示使用Struts2的 ActionError 和 ActionMessage 类. 1. ActionError – 是用来发送错误信息反馈给用户 - 通过 <s:actionerro ...