先看源代码图片
在242行通过宽度,高度,宽高比筛选出可能的候选区,并保存在rects中,在需要的地方,按照rects中保存的矩形框裁剪下来。如果选中了学习模式的Checkbox就把这些候选区座位图片保存到SD卡上,这些图片就需要人工分类后,分别放到19个文件夹中,就是最终的样本。样本越多,样本越准确,识别的结果也越准确,但是跟多的样本也会导致速度的更慢。
在273行开始,就是真正的进入识别过程了
识别过程有如下步骤
1.初始化机器学习引擎(在App启动的时候做了这件事)
这个初始化,首先是把样本图片按照设定好的参数转换成向量特征,识别过程中并不是对比的图片而是对比的特征,这一点需要牢记,如果是对比图片那就是另一种算法了。所以其实我们整理好识别的图片后保存它们的特征就好了,特征比图片占用的存储空间小很多。在机器学习的生产环境是不会把样本转换成特征的过程放到最终的程序中的,最终的程序只负责把特征加载到机器学习引擎中用于计算。我这里之所以每次都要从图片转换为特征,就是为了我方便添加样本文件到文件夹中,添加好了重启一下App就行了,再走一下初始化过程,而不需要单独处理特征文件(实际上整个过程都没有涉及到特征文件)。
2.把所有的候选区每张图都转换成特征值,轮流放到机器学习引擎中得到一个最佳的匹配
只有KNN才这么干,其他的学习算法大多数都不会这么做
3.整理结果
对于本例,需要把结果集进行整理,比如排列顺序,计算花色,确定扑克牌上的10 的位置
在297行中保存了所有的识别结果,接下来就需要整理了,整理算法如下
第一步:按照裁剪的起始位置进行排序(花色和数字分成两组),把所有的结果都进行排序,得到正确的顺序
第二步:处理扑克牌为10的结果,因为10是1和0分开的,在识别的时候是2个结果,如果排序后发现,1之后是0,就合并成一个结果为10
第三步:本例中只考虑了18中情况,也没有考虑大小王的情况,分组成2组后分别是(A,2,3,4,5,6,7,8,9,10,J,Q,K),花色组是(红桃,黑桃,方块,梅花).
第四步:判定识别结果是否成功
识别成功的条件就是识别出所有的花色和字符组合,本例中识别的是13张牌,所以必须要识别出13张牌,才算成功,由于识别光线,角度等原因,不可能每次都能识别成功,所以要用红色框引导用户对齐识别区域。这样一来能帮助对齐识别区域,二来减少计算的图片大小,提升速度。
所以:对于本例的结果是得到字符分组和花色分组都是13个元素才算成功,因为是按照起始位置排序的,当13个字符和13个花色都确定的情况下,那么两组数据都是一一对应的正确结果了。