java ean13_【求大神指导】java实现EAN13条形码识别
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谁能给我分析下下面的代码原理。。。拜谢。。。
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条形码识别相关推荐
- java日历打印出的格式不对_Java打印某年某月的日历 没有错误但是运行出的月份与实际不符 求大神指导...
Java打印某年某月的日历 没有错误但是运行出的月份与实际不符 求大神指导 我看了一下日历,发现你打出来的其实是九月份而不是八月份,那么我猜在showPrint这里的第二个参数是从0开始的,即0~11 ...
- 遗传算法优化BP神经网络出现输入参数不足,是什么原因啊,求大神指导,代码如下
用遗传算法优化BP神经网络,在加粗那行出现输入参数不足,是什么原因啊,求大神指导,代码如下 function err=Bpfun(x,P,T,hiddennum,P_test,T_test) fid= ...
- 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* ...
- python 扯线木偶_Python计算器求助~求大神指导~QAQ急!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 from tkinter import * root = Tk() root.title('计算器') exp = StringVar() #用于在存储文 ...
- 12345组成三个不重复数java,求大神帮忙!五子棋!只能识别按顺序识别!例如 12345 不能...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.util.Arrays; import java.util.Scanner; public class Gobang { publ ...
- java 网格包,求大神解答:JAVA网格包布局管理器小程序问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为什么我在这个程序上加入了一个Container对象就出问题了,求解答,要如何改: package A; import java.awt.*; impor ...
- 红盟php 解密,php教程_求大神将一个java的aes解密帮忙改写成php版的
阅读推荐: php教程_PHP 5.4中引用的的几个小问题 艾轩油画西藏女孩 php教程_JavaScript与HTML结合的基本使用方法整理 php教程_将PHP作为Shell脚本语言使用 会声会影 ...
- 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 ...
- android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...
//调用未成功后的log 12-09 23:44:49.231 6792-8199/com.example.administrator.matata_android D/MicroMsg.SDK.WX ...
- c语言eallow,求大神指导C语言框图设计!!!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include "DSP281x_Device.h" #include "DSP281x_Examples.h" ...
最新文章
- Pandas 基础 (4)—— 汇总和计算描述统计
- 北京计算机学院 肖战,Shuai Li
- 李宏毅线性代数笔记5:线性方程组
- 【自动驾驶】毫米波雷达相关知识专题
- unbuntu server (linux系统)下面安装 lamp
- spring 配置多数据源
- 洛谷团队月赛题:题解
- plesk 运行不了php,如何在Plesk中使用composer(使用其他版本的PHP运行Composer)
- 《TCP/IP详解》学习笔记(六):UDP 协议
- 微信公布朋友圈9月十大谣言 包括新型手机病毒出现等
- 湖北经济学院计算机专业全国排名,2018年湖北经济学院世界排名、中国排名、专业排名...
- 2018最新hadoop服务器环境配置教程(附详细步骤)
- 好看的php表格样式,HTML5制作表格样式
- 中文字符集与字符编码的基础知识
- HTB-SolidState
- 初识智遥工作流软件——表单开发篇1
- 家谱处理(30 分)(字符串的处理substr)
- Thinkphp5添加谷歌双重验证
- Android RrecyclerView条目跳转到指定位置
- 在Java中,每个try块后面都必须紧跟catch块吗?
热门文章
- js vue 获取 (昨天、今天、明天) 时间
- graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
- docker 安装 Nginx 并配置反向代理
- 学校计算机怎么连接自己的热点,笔记本电脑怎么连接手机热点(手机热点开启及连接方法)...
- vue,el-image 图片引入根路径@无效
- 使用regexp_extract、regexp_replace函数过滤特殊字符时,不同的执行情境下(hive -e;hive -f),正则表达式的内容有变化
- 枪林弹雨 该服务器维护中,枪林弹雨登陆BUG解决方法
- OJ 2308 Problem D	Grape
- 如何把.bat文件设置为开机自动启动?
- 选择与循环:剪刀石头布_剪刀石头布十大奢侈家具,创造高端精致生活就是这么简单!...