该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

谁能给我分析下下面的代码原理。。。拜谢。。。

package stj;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

/**

* ean13是一种(7,2)码,即每个字符的总宽度为7个模块宽,交替由两个条和空组成,而每个条空的宽度不超过4个模块

* 用来识别EAN13方式编码的图片

* 图片高度像素必须大于 30px,宽度像素必须大于 200px

* 图片区域内只包含条码和空白部分,且左右两端的空白部分必须在 10%-20%左右

* @author tangkf

*/

public class EAN13Reader {

static int HEIGHT = 6; //截取的样本图像像素高度

static int BW_MID = 100; //判断黑白的阀值

static int [][] LEFT_TABLE_INT = new int[] []{

{3,2,1,1},{2,2,2,1},{2,1,2,2},{1,4,1,1},{1,1,3,2},

{1,2,3,1},{1,1,1,4},{1,3,1,2},{1,2,1,3},{3,1,1,2},

{1,1,2,3},{1,2,2,2},{2,2,1,2},{1,1,4,1},{2,3,1,1},

{1,3,2,1},{4,1,1,1},{3,1,2,1},{3,1,2,1},{2,1,1,3}

};//左端,二维数组,[20][4]

//A=(a1,a2,a3,a4) 表示一个条码字符,1<=ai<=4,a1+a2+a3+a4+a=7

static int [][] RIGHT_TABLE_INT = new int[] []{

{3,2,1,1},{2,2,2,1},{2,1,2,2},{1,4,1,1},{1,1,3,2},

{1,2,3,1},{1,1,1,4},{1,3,1,2},{1,2,1,3},{3,1,1,2}

};//右端[10][4]

/**

* 测试

* @author tangkf

* @param args

*/

public static void main(String[] args) {

long a = System.currentTimeMillis();

String src = "d:/Code/twocode/图片1.png";

BufferedImage img = getImg(src);

long b = System.currentTimeMillis();

System.err.println("读取图片耗时:"+(b-a)+" ms");

System.out.println("解码结果:"+getRealValue(img));

long c = System.currentTimeMillis();

System.err.println("图片解码耗时:"+(c-b)+" ms");

}

/**

* 根据条码图像区域返回条码数据

* @author tangkf

* @param img 图像区域

* @return

*/

public static String getRealValue(BufferedImage img){

int w = img.getWidth();

int h = img.getHeight();

int y = (int)(h/2);

if(y

return "无法识别的条码";

}

if(h>HEIGHT*2)

y= (int)(h/2)-(HEIGHT/2);

else y = 1;

StringBuffer valuestr = new StringBuffer("");

int chg = 0; //记录颜色变化次数

int gvn = 0; //记录实际取值次数(每变化一次取值一次)

int ln = 0; //记录同色连续像素的数量

int uprv= -1; //记录上次的像素取值

int xdv = 0; //参考底色,取前8个像素的颜色作为底色参考值

int[] gvalue = new int[4]; //临时记录一组数字

for(int i=0;i

int v = 0; //记录取值为深色的次数

//高度取HEIGHT个像素,并求平均值,如果平均值为浅色,那么取0,否则取1

for(int j=y;j

int prgb = getValue(img.getRGB(i,j));

xdv += prgb;

if(prgb

}

int rv = 0;

if(i<8){

//取参考颜色样本,默认都为0

rv = 0;

BW_MID = xdv/((i+1)*(HEIGHT)); //不断变换参考样本值

}else{

rv = v>HEIGHT/2?1:0; //n个以上的像素为深色,就表示该列为深色

}

if(rv==uprv){

ln++;

}else{

chg++; //变化次数+1

if(chg>1 && chg<6){

//起始符号

gvalue[(chg-2)%4] = ln;

if((chg-1)%4==0){

valuestr.append(getSTDValue(gvalue, LEFT_TABLE_INT));

//System.err.println(gvalue[0]+""+gvalue[1]+gvalue[2]+gvalue[3]);

}

}

if((chg>5 && chg<30)|| (chg>34 && chg<59)){

gvn++;

if(gvn%4==0){

gvalue[(gvn-1)%4] = ln;

if(gvn<=24){

valuestr.append(getSTDValue(gvalue, LEFT_TABLE_INT));

//valuestr.append(ln+ " RV:"+ getSTDValue(gvalue, LEFT_TABLE_INT) + "\n");

}else{

valuestr.append(getSTDValue(gvalue, RIGHT_TABLE_INT));

//valuestr.append(ln+ " RV:"+ getSTDValue(gvalue, RIGHT_TABLE_INT) + "\n");

}

}else {

gvalue[(gvn-1)%4] = ln;

}

}

ln = 1;

}

uprv = rv;

}

return valuestr.toString();

}

/**

* 由一组样本 与 基准表 通过 方差和 的方式去噪求值

* @param mvalues

* @param STDTABLE

* @return

*/

public static int getSTDValue(final int[] mvalues,int[][] STDTABLE){

int rvalue = 0;

int fx = 0;

for(int i=0;i

int[] svalues = LEFT_TABLE_INT[i]; //基准值

int[] xvalue = new int[4];

for(int j=0;j

xvalue[j] = (int)((double)mvalues[j]/svalues[j]+0.5);

}

int tmp = getFX(xvalue);

if(i==0){

fx = tmp;

}else{

if(tmp

fx = tmp;

rvalue = i>9?i-10:i;

}

}

}

return rvalue;

}

/**

* 求一组样本数的方差和(针对所有样本数都相同的情况简化算法)

* @param numlist

*/

public static int getFX(int[] numlist){

if(numlist.length<1) return 0;

int fx = 0;

double avg = 0;

for(int i=0;i

avg += numlist[i];

}

avg = (int)((double)avg/numlist.length+0.5);

for(int i=0;i

fx += (numlist[i]-avg)*(numlist[i]-avg);

}

return fx;

}

/**

* 由色彩值返回单色信号 1 或 0

* @param rgb

* @return

*/

public static int getValue(int rgb){

int r = (rgb>>16)&255;

int g = (rgb>>8)&255;

int b = rgb&255;

double avg = 0.299*r+0.587*g+0.114*b; //判断黑白

return (int)avg;

}

/**

* 读取图片

* @param srcImg

* @return

*/

public static BufferedImage getImg(String srcImg){

BufferedImage img = null;

try {

img = ImageIO.read(new File(srcImg));

} catch (IOException e) {

e.printStackTrace();

}

return img;

}

}

java ean13_【求大神指导】java实现EAN13条形码识别相关推荐

  1. java日历打印出的格式不对_Java打印某年某月的日历 没有错误但是运行出的月份与实际不符 求大神指导...

    Java打印某年某月的日历 没有错误但是运行出的月份与实际不符 求大神指导 我看了一下日历,发现你打出来的其实是九月份而不是八月份,那么我猜在showPrint这里的第二个参数是从0开始的,即0~11 ...

  2. 遗传算法优化BP神经网络出现输入参数不足,是什么原因啊,求大神指导,代码如下

    用遗传算法优化BP神经网络,在加粗那行出现输入参数不足,是什么原因啊,求大神指导,代码如下 function err=Bpfun(x,P,T,hiddennum,P_test,T_test) fid= ...

  3. matlab求解复杂隐函数,MATLAB复杂隐函数求解!求大神指导!

    问题描述: MATLAB复杂隐函数求解!求大神指导! syms D1 D2 G1 G2 al E1 E2 Km w6 G1=10^(-5);G2=10^(-5); E1=2*(10^11);E2=2* ...

  4. python 扯线木偶_Python计算器求助~求大神指导~QAQ急!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 from tkinter import * root = Tk() root.title('计算器') exp = StringVar() #用于在存储文 ...

  5. 12345组成三个不重复数java,求大神帮忙!五子棋!只能识别按顺序识别!例如 12345 不能...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.util.Arrays; import java.util.Scanner; public class Gobang { publ ...

  6. java 网格包,求大神解答:JAVA网格包布局管理器小程序问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为什么我在这个程序上加入了一个Container对象就出问题了,求解答,要如何改: package A; import java.awt.*; impor ...

  7. 红盟php 解密,php教程_求大神将一个java的aes解密帮忙改写成php版的

    阅读推荐: php教程_PHP 5.4中引用的的几个小问题 艾轩油画西藏女孩 php教程_JavaScript与HTML结合的基本使用方法整理 php教程_将PHP作为Shell脚本语言使用 会声会影 ...

  8. matlab四条曲线围成面,matlab中怎么给四条曲线作出图例啊?求大神指导

    clear all: clc disp('插值求取平滑曲线后的数值' ) t = [5 10 15 20 30 40 60 80 120] ; A = [29.84 40.01 46.71 53.87 ...

  9. android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...

    //调用未成功后的log 12-09 23:44:49.231 6792-8199/com.example.administrator.matata_android D/MicroMsg.SDK.WX ...

  10. c语言eallow,求大神指导C语言框图设计!!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include "DSP281x_Device.h" #include "DSP281x_Examples.h" ...

最新文章

  1. Pandas 基础 (4)—— 汇总和计算描述统计
  2. 北京计算机学院 肖战,Shuai Li
  3. 李宏毅线性代数笔记5:线性方程组
  4. 【自动驾驶】毫米波雷达相关知识专题
  5. unbuntu server (linux系统)下面安装 lamp
  6. spring 配置多数据源
  7. 洛谷团队月赛题:题解
  8. plesk 运行不了php,如何在Plesk中使用composer(使用其他版本的PHP运行Composer)
  9. 《TCP/IP详解》学习笔记(六):UDP 协议
  10. 微信公布朋友圈9月十大谣言 包括新型手机病毒出现等
  11. 湖北经济学院计算机专业全国排名,2018年湖北经济学院世界排名、中国排名、专业排名...
  12. 2018最新hadoop服务器环境配置教程(附详细步骤)
  13. 好看的php表格样式,HTML5制作表格样式
  14. 中文字符集与字符编码的基础知识
  15. HTB-SolidState
  16. 初识智遥工作流软件——表单开发篇1
  17. 家谱处理(30 分)(字符串的处理substr)
  18. Thinkphp5添加谷歌双重验证
  19. Android RrecyclerView条目跳转到指定位置
  20. 在Java中,每个try块后面都必须紧跟catch块吗?

热门文章

  1. js vue 获取 (昨天、今天、明天) 时间
  2. graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
  3. docker 安装 Nginx 并配置反向代理
  4. 学校计算机怎么连接自己的热点,笔记本电脑怎么连接手机热点(手机热点开启及连接方法)...
  5. vue,el-image 图片引入根路径@无效
  6. 使用regexp_extract、regexp_replace函数过滤特殊字符时,不同的执行情境下(hive -e;hive -f),正则表达式的内容有变化
  7. 枪林弹雨 该服务器维护中,枪林弹雨登陆BUG解决方法
  8. OJ 2308 Problem D Grape
  9. 如何把.bat文件设置为开机自动启动?
  10. 选择与循环:剪刀石头布_剪刀石头布十大奢侈家具,创造高端精致生活就是这么简单!...