牙叔教程 简单易懂
待识别的图片
这个是放大了6倍的效果
第一步: 识别轮廓
关键代码
Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE, Point());
第二步: 分析数据, 去除多余的轮廓
左侧的豆豆, 我们不需要, 所以要去除, 依据是图片中最大的轮廓;
去除豆豆之后, 我们只留下豆豆右侧的轮廓, 这样也直接去除了, 豆豆内部的一个小轮廓;
中间的逗号, 我们不需要, 通过高度判断来去除逗号;
首先对轮廓, 按照高度从低到高进行排序,
有时候是三位数, 有时候是四位数, 只有四位数的时候才有逗号;
中间的逗号我们不需要, 9的内部轮廓, 我们也不需要;
去除他俩的依据是,:
如果一个轮廓的高度 小于 轮廓集合中最高的高度的0.75,
那么我们就认为他不是数字, 直接删除;
去除多余轮廓后的效果
第三步: 分割数字
第四步: 提取指纹
上面提取的数字图片是彩色的, 我们这样处理图片
- 缩放图片至合适的尺寸, 为了保证细节足够, 以便识别更准确
- 灰度化图片
- 二值化图片
- 二值图转字符串
提取指纹关键代码
let newImg = images.resize(img, [29]); let grayImg = images.grayscale(newImg); var thresholdImg = images.adaptiveThreshold(grayImg, 1, "MEAN_C", "BINARY_INV", 3, 3); let imgHash = mat2Str(thresholdImg.mat); function mat2Str(mat) { let w = mat.rows(); let h = mat.cols(); let lines = new Array(h); for (var i = 0; i < h; i++) { let line = new Array(w); for (var j = 0; j < w; j++) { let item = mat.get(i, j); let value = item[0]; line[j] = value; } lines[i] = line.join(""); } let content = lines.join("\n"); // let content = lines.join(""); return content; }
第五步: 验证效果
截取一些小图片, 用来验证效果;
所有图片都要经历:
- 找轮廓
- 去除多余轮廓
- 分割图片
- 提取指纹
- 比较指纹距离
指纹的距离用 汉明距离 比较, 这个距离合适吗?
有没有更适合的距离算法?
全部正确 !
测试环境
手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.16
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途