首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

京东价位图片识别

2013-04-21 
京东价格图片识别当做图片识别用tesseract,需要分布式跨平台部署时,依赖tesseract的cmd命令识别就感觉不太

京东价格图片识别
当做图片识别用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 B255if (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;}}

热点排行