package com.github.axet.lookup; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import com.github.axet.lookup.common.FontFamily; import com.github.axet.lookup.common.FontSymbol; import com.github.axet.lookup.common.FontSymbolLookup; import com.github.axet.lookup.common.GPoint; import com.github.axet.lookup.common.ImageBinary; import com.github.axet.lookup.common.ImageBinaryGrey; import com.github.axet.lookup.common.LessCompare; import com.github.axet.lookup.proc.CannyEdgeDetector; import com.github.axet.lookup.proc.NCC; public class OCRCore { static class BiggerFirst implements Comparator<FontSymbolLookup> { @Override public int compare(FontSymbolLookup arg0, FontSymbolLookup arg1) { int o = Math.max(arg0.size(), arg1.size()); int r = LessCompare.compareBigFirst(arg0.size(), arg1.size(), o / 2); // beeter qulity goes first if (r == 0) r = LessCompare.compareBigFirst(arg0.g, arg1.g); if (r == 0) r = LessCompare.compareBigFirst(arg0.size(), arg1.size()); return r; } } class Left2Right implements Comparator<FontSymbolLookup> { @Override public int compare(FontSymbolLookup arg0, FontSymbolLookup arg1) { int r = 0; if (r == 0) { if (!arg0.yCross(arg1)) r = LessCompare.compareSmallFirst(arg0.y, arg1.y); } if (r == 0) r = LessCompare.compareSmallFirst(arg0.x, arg1.x); if (r == 0) r = LessCompare.compareSmallFirst(arg0.y, arg1.y); return r; } } Map<String, FontFamily> fontFamily = new HashMap<String, FontFamily>(); CannyEdgeDetector detector = new CannyEdgeDetector(); // 1.0f == exact match, -1.0f - completely different images float threshold = 0.70f; public OCRCore(float threshold) { this.threshold = threshold; detector.setLowThreshold(3f); detector.setHighThreshold(3f); detector.setGaussianKernelWidth(2); detector.setGaussianKernelRadius(1f); } List<FontSymbol> getSymbols() { List<FontSymbol> list = new ArrayList<FontSymbol>(); for (FontFamily f : fontFamily.values()) { list.addAll(f); } return list; } List<FontSymbol> getSymbols(String fontFamily) { return this.fontFamily.get(fontFamily); } List<FontSymbolLookup> findAll(List<FontSymbol> list, ImageBinaryGrey bi) { return findAll(list, bi, 0, 0, bi.getWidth(), bi.getHeight()); } List<FontSymbolLookup> findAll(List<FontSymbol> list, ImageBinary bi, int x1, int y1, int x2, int y2) { List<FontSymbolLookup> l = new ArrayList<FontSymbolLookup>(); for (FontSymbol fs : list) { List<GPoint> ll = NCC.lookupAll(bi, x1, y1, x2, y2, fs.image, threshold); for (GPoint p : ll) l.add(new FontSymbolLookup(fs, p.x, p.y, p.g)); } return l; } }