牙叔教程 简单易懂
群里有人问
思路
提取书本中间的线-> 切开
提取书本中间的线
Canny 边缘检测
Imgproc.Canny(grayMat, cannyMat, lowThreshold, lowThreshold * ratio, kernel_size, false);
霍夫变换直线检测
function getHoughLinesP(mat, size) { let lines = new Mat(); let threshold = size / 5; // 阈值,只有获得足够交点的极坐标点才被看成是直线 let minLineSize = size; // 最小直线长度,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。 let lineGap = size; // 最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离。 Imgproc.HoughLinesP(mat, lines, 1, Math.PI / 180, threshold, minLineSize, lineGap); return lines; }
过滤直线
直线的横坐标应该在图片中间
function filterLineDataList(lines) { // { angle: 90, distance: 786, x1: 4, y1: 925, x2: 4, y2: 139 }, let newLines = []; var len = lines.length; let centerX = img.width / 2; for (var i = 0; i < len; i++) { let line = lines[i]; if (Math.abs(line.x1 - centerX) < img.width / 4 && Math.abs(line.x2 - centerX) < img.width / 4) { newLines.push(line); } } return newLines; }
计算切割点
计算直线和上下两边的交点
function getFocusCoordinatesOfTwoLines(line1, line2) { var x1 = line1.x1; var y1 = line1.y1; var x2 = line1.x2; var y2 = line1.y2; var x3 = line2.x1; var y3 = line2.y1; var x4 = line2.x2; var y4 = line2.y2; var x = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)); var y = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)); return { x: x, y: y }; }
分割图片
let clipImg = images.clip(img, 0, 0, leftPageTopSideLength, img.height); pts.add(new MatOfPoint(topLeftPoint, topRightPoint, bottomRightPoint, bottomLeftPoint, topLeftPoint)); Imgproc.fillPoly(polyMat, pts, Scalar(255), 1); Core.bitwise_and(clipImg.mat, newPolyMat, newMat);
测试环境
手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.10
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途