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

2 篇文章 0 订阅
2 篇文章 0 订阅

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


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


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

关键代码如下


@Override
public 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);
}

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



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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值