京东价格图片识别

当做图片识别用tesseract,需要分布式跨平台部署时,依赖tesseract的cmd命令识别就感觉不太靠谱了。
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.log4j.Logger;

public class PriceUtils {
	
	private static Logger logger = Logger.getLogger(PriceUtils.class);

	/**
	 * 解析京东商品价格
	 * 
	 * @param url
	 * @return
	 * @throws IOException
	 */
	public static String parsePrice(String url) {
		try {
			BufferedImage img = ImageIO.read(new URL(url));
			int width = img.getWidth();
			int height = img.getHeight();
			byte[][] data = new byte[height][width];
			for (int x = 0; x < height; x++) {
				for (int y = 0; y < width; y++) {
					if (isWhite(img.getRGB(y, x)) == 1) {
						data[x][y] = 0;
						// if (x == 0) {
						// System.out.print(y + "\t");
						// } else {
						// if (y == 0) {
						// System.out.print(x + "\t");
						// } else {
						// System.out.print(" \t");
						// }
						// }
					} else {
						data[x][y] = 1;
						// System.out.print("*\t");
					}
				}
				// System.out.println("");
			}
			/** 列数 */
			List<int[]> columns = getColumns(data);
			/** 行数 */
			int[] rows = getRows(data);
			List<byte[][]> bytes = new ArrayList<byte[][]>();
			byte[][] tmp;
			int row = rows[1] - rows[0] + 1;
			int index;
			for (int[] is : columns) {
				tmp = new byte[row][];
				index = 0;
				for (int i = rows[0]; i <= rows[1]; i++) {
					// System.out.println("i:"+i+"["+is[0]+","+is[1]+"]");
					// for(int j=is[0];j<=is[1];j++){
					// System.out.print(data[i][j]);
					// }
					// System.out.println();
					tmp[index++] = Arrays
							.copyOfRange(data[i], is[0], is[1] + 1);
				}
				bytes.add(tmp);
			}
			Prices t;
			List<Prices> prices = new ArrayList<Prices>();
			for (byte[][] b : bytes) {
				t = Prices.imgFor(b);
				if (t != null) {
					prices.add(t);
				}
			}
			String s = "";
			for (Prices p : prices) {
				s = s + p.getValue();
			}
			return s;
		} catch (IOException e) {
			logger.warn("解析价格出错url["+url+"]",e);
			return "";
		}
	}

	public static int[] getRows(byte[][] data) {
		List<Integer> list = new ArrayList<Integer>();
		int height = data.length;
		int width = data[0].length;
		boolean flag_1;
		for (int i = 0; i < height; i++) {
			flag_1 = true;
			for (int j = 0; j < width; j++) {
				if (data[i][j] == 1) {
					flag_1 = false;
				}
			}
			if (flag_1) {
				list.add(i);
			}
		}
		int size = list.size();
		int[] rows = null;
		for (int i = 0; i < size - 1; i++) {
			if (list.get(i + 1) - list.get(i) > 1) {
				// System.out.println("行[" + (list.get(i) + 1) + ","+ (list.get(i + 1) - 1) + "]");
				rows = new int[] { list.get(i) + 1, list.get(i + 1) - 1 };
			}
		}
		return rows;
	}

	public static List<int[]> getColumns(byte[][] data) {
		List<Integer> list = new ArrayList<Integer>();
		List<int[]> columns = new ArrayList<int[]>();
		int height = data.length;
		int width = data[0].length;
		boolean flag_1;
		for (int i = 0; i < width; i++) {
			flag_1 = true;
			for (int j = 0; j < height; j++) {
				if (data[j][i] == 1) {
					flag_1 = false;
				}
			}
			if (flag_1) {
				list.add(i);
			}
		}
		int size = list.size();
		for (int i = 0; i < size - 1; i++) {
			if (list.get(i + 1) - list.get(i) > 1) {
				// System.out.println("列[" + (list.get(i) + 1) + "," + (list.get(i + 1) - 1) + "]");
				columns.add(new int[] { list.get(i) + 1, list.get(i + 1) - 1 });
			}
		}
		return columns;
	}

	public static int isWhite(int colorInt) {
		Color color = new Color(colorInt);
		// R255 G255 B255
		if (color.getRed() + color.getGreen() + color.getBlue() > 400) {
			return 1;
		}
		return 0;
	}

	public static void main(String args[]) throws Exception {
		String url = "http://jprice.360buyimg.com/price/gp749416-1-1-1.png";
		System.out.println(parsePrice(url));

	}

}



public enum Prices {

	_Y("¥",new byte[][] { 
			{1,1,1,1,0,1,1,1,1},
			{0,1,1,1,0,0,1,1,0},
			{0,0,1,1,1,0,1,0,0},
			{0,0,1,1,1,0,1,0,0},
			{0,0,0,1,1,1,0,0,0},
			{0,0,0,1,1,1,0,0,0},
			{0,0,1,1,1,1,1,0,0},
			{0,0,0,1,1,1,0,0,0},
			{0,0,0,1,1,1,1,0,0}
	}),
	_POINT(".",new byte[][] { 
		{0,0},
		{0,0},
		{0,0},
		{0,0},
		{0,0},
		{0,0},
		{0,0},
		{1,1},
		{1,1}
	}),
	_0("0",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0}
	}),
	_1("1",new byte[][] { 
		{0,0,0,0},
		{0,1,1,0},
		{1,1,1,0},
		{0,1,1,0},
		{0,1,1,0},
		{0,1,1,0},
		{0,1,1,0},
		{0,1,1,0},
		{1,1,1,1}
	}),
	_2("2",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{0,0,0,0,1,1},
		{0,0,0,1,1,0},
		{0,0,1,1,0,0},
		{0,1,1,0,0,0},
		{1,1,0,0,0,0},
		{1,1,1,1,1,1}
	}),
	_3("3",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{0,0,0,0,1,1},
		{0,0,1,1,1,0},
		{0,0,0,0,1,1},
		{0,0,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0}
	}),
	_4("4",new byte[][] { 
		{0,0,0,0,0,0},
		{0,0,0,0,1,0},
		{0,0,0,1,1,0},
		{0,0,1,1,1,0},
		{0,1,0,1,1,0},
		{1,0,0,1,1,0},
		{1,1,1,1,1,1},
		{0,0,0,1,1,0},
		{0,0,0,1,1,0}
	}),
	_5("5",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,1},
		{0,1,1,0,0,0},
		{0,1,1,0,0,0},
		{0,1,1,1,1,0},
		{0,0,0,0,1,1},
		{0,0,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0}
	}),
	_6("6",new byte[][] { 
		{0,0,0,0,0,0},
		{0,0,1,1,1,0},
		{0,1,1,0,0,0},
		{1,1,0,0,0,0},
		{1,1,1,1,1,0},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0}
	}),
	_7("7",new byte[][] { 
		{0,0,0,0,0,0},
		{1,1,1,1,1,1},
		{0,0,0,0,1,1},
		{0,0,0,1,1,0},
		{0,0,0,1,1,0},
		{0,0,1,1,0,0},
		{0,0,1,1,0,0},
		{0,1,1,0,0,0},
		{0,1,1,0,0,0}
	}),
	_8("8",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,0}
	}),
	_9("9",new byte[][] { 
		{0,0,0,0,0,0},
		{0,1,1,1,1,0},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{1,1,0,0,1,1},
		{0,1,1,1,1,1},
		{0,0,0,0,1,1},
		{0,0,0,1,1,0},
		{0,1,1,1,0,0}
	});
	private byte[][] img;
	private String value;
	private Prices(String value,byte[][] img){
		this.value = value;
		this.img = img;
	}
	
	public byte[][] getImg(){
		return this.img;
	}
	
	public String getValue(){
		return this.value;
	}
	
	public static Prices imgFor(byte[][] img) {
		Prices wt = null;
		if (img == null) {
			return wt;
		}
		Prices[] wts = Prices.values();
		for(Prices w : wts){
			if(deepEquals(w.img,img)){
				wt = w;
				break;
			}
		}
		return wt;
	}
	
	public static Prices valueFor(String v) {
		Prices wt = null;
		if (v == null) {
			return wt;
		}
		Prices[] wts = Prices.values();
		for(Prices w : wts){
			if(v.equals(w.value)){
				wt = w;
				break;
			}
		}
		return wt;
	}
	
	public static boolean deepEquals(byte[][] a, byte[][] b) {
		try {
			for (int i = 0; i < a.length; i++)
				for (int j = 0; j < a[i].length; j++)
					if (a[i][j] != b[i][j])
						return false;
			return true;
		} catch (Exception e) {
		}
		return false;
	}
	
}

猜你喜欢

转载自wingware.iteye.com/blog/1849434