-写霸-Android 实现字体识别(二)

来源:互联网 发布:外贸软件 知乎 编辑:程序博客网 时间:2024/06/05 07:41

上次简单说了一下 字体识别的分析 这篇 咱们就来一点一点探求一下这个的实现吧


这个字体识别软件 会用到 SQLite 以及 简单的 Android绘图 


首先我们需要建立一个模板 就是汉字笔画的模板 这个模板就需要用到SQLite了 

关键代码如下


@Overridepublic boolean onTouchEvent(MotionEvent event) {// Log.e("Draw", "onTouchEvent");float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:chardata = new ArrayList<CharData>();Log.v("Draw", "startx=" + x + "    y=" + y);path.moveTo(x, y);currentPreX = x;currentPreY = y;lastPreX = x;lastPreY = y;currentX = (int) (x / (Width / GridNum)) + 1;currentY = (int) (y / (Width / GridNum)) + 1;String grid = "(" + currentX + "," + currentY + ")";System.out.println(grid);gridList.add(grid);addData(x, y);System.out.println("起点坐标" + x + "," + y);break;case MotionEvent.ACTION_MOVE:Log.v("Draw", "x=" + x + "    y=" + y);path.quadTo(currentPreX, currentPreY, x, y);lastX = (int) (lastPreX / (Width / GridNum)) + 1;lastY = (int) (lastPreY / (Width / GridNum)) + 1;currentX = (int) (x / (Width / GridNum)) + 1;currentY = (int) (y / (Width / GridNum)) + 1;String grids = "(" + currentX + "," + currentY + ")";// 如果换格子了 就进入if (listDataQuery(grids)) {gridList.add(grids);charCUP(x, y);}currentPreX = x;currentPreY = y;break;case MotionEvent.ACTION_UP:Log.v("Draw", "endx=" + x + "    y=" + y);System.out.println("终点坐标" + x + "," + y);addData(x, y);Datas.add(chardata);/*** 计算度数 计算笔顺 去除杂点 计算大小*/// JSAngle();cacheCanvas.drawPath(path, paints);path.reset();// chardata.clear();// initCanvas();for (int i = 0; i < Datas.size(); i++) {System.out.println("第" + i + "笔" + Datas.get(i).size());}break;}invalidate();return true;}/*** 计算笔顺*/void JSStrokeNum() {int num = 0;chardata.get(0).setIndex(0);float oneAngle, twoAngle;for (int i = 1; i < chardata.size(); i++) {oneAngle = chardata.get(i).getAngle();if (i + 1 < chardata.size()) {twoAngle = chardata.get(i + 1).getAngle();if (Math.abs(oneAngle - twoAngle) > 180) {num = StrokeNumJiSuan(i, num, oneAngle, twoAngle, 0);} else {num = StrokeNumJiSuan(i, num, oneAngle, twoAngle, 1);}}}}/*** 计算笔顺方法* * @param i* @param num* @param oneAngle* @param twoAngle* @param type*/int StrokeNumJiSuan(int i, int num, float oneAngle, float twoAngle, int type) {float angles = 0;if (type == 0) {angles = 180 - (360 - Math.abs(oneAngle - twoAngle));} else {angles = Math.abs(oneAngle - twoAngle);}if (angles > 36) {num++;chardata.get(i + 1).setIndex(num);} else {if (i + 2 < chardata.size()) {twoAngle = chardata.get(i + 2).getAngle();if (Math.abs(oneAngle - twoAngle) > 180) {float angless = 180 - (360 - Math.abs(oneAngle - twoAngle));if (angless > 36) {System.out.println(oneAngle + "****" + twoAngle);num++;chardata.get(i + 1).setIndex(num);} else {chardata.get(i + 1).setIndex(num);}} else {if (Math.abs(oneAngle - twoAngle) > 36) {System.out.println(oneAngle + "****" + twoAngle);num++;chardata.get(i + 1).setIndex(num);} else {chardata.get(i + 1).setIndex(num);}}} else {chardata.get(i + 1).setIndex(num);}}return num;}/*** 顺序写入点* * @param x* @param y*/void addData(float x, float y) {CharData data = new CharData();data.setPointX(x);data.setPointY(y);data.setAngle(0);data.setIndex(0);chardata.add(data);}/*** 根据位置写入点* * @param x* @param y*/void addData(int wz, float x, float y) {CharData data = new CharData();data.setPointX(x);data.setPointY(y);data.setAngle(0);data.setIndex(0);chardata.add(wz, data);}

以上就是笔画模板的核心代码 给大家说明一下 



首先 我们要获取用户输入的点坐标 通过记录用户手指走过的路径 来得到用户输入的这一笔的坐标我们存到一个集合里面

然后我们需要对这个集合里面的坐标进行 去除没有用的坐标点 然后增加标记点 记录用户在一笔里面是否有一些拐弯啦什么 最后通过算法优化等 来得到一个笔画的模板然后把它存到我们相应的模板库中  有什么不明白的地方欢迎大家在评论里面提问 

0 0
原创粉丝点击