美文网首页
autojs提高二维码识别率(一)-标记定位点

autojs提高二维码识别率(一)-标记定位点

作者: 牙叔教程 | 来源:发表于2022-03-15 17:53 被阅读0次

    效果

    1-效果.jpg

    上图中, 完整的标记点一共有4个,
    在一起的3个标记点, 是红色;
    顶部的单独标记点是蓝色

    思路

    每一个细节都有很多的步骤, 先说一个大致的思路


    2-大致思路.png

    识别标记点思路

    3-提取标记点.png

    1-查找轮廓
    注意, 我们要让轮廓包含最全的信息, 所以这里使用的是 Imgproc.RETR_TREE

    Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, Point());
    

    2-提取轮廓数据, 宽高, 中心点, 面积, 旋转角度, 最小外接矩形

      {
        w: 54,
        h: 54,
        cx: 460,
        cy: 555,
        area: 2671,
        angle: 0,
        boundingRect: {
          x: 433,
          y: 528,
          tl: '{"x":433.0,"y":528.0}',
          br: '{"x":488.0,"y":583.0}',
        },
      },
    

    3-标记点特征
    第一: 子轮廓至少两个;
    第二: 宽高比例在1.3以内, 这样就认为是一个正方形
    第三: 轮廓拟合多边形后, 如果是四边形, 就认为是四边形, 是不是废话Y(_)Y;
    第四: 二值化之后, 同一个二维码的标记点, 同行或同列的标记点, 中间的黑色点至少占三成;

    为了更精确, 还可以添加更多的特征, 不止以上四个;

    let config = {
      minimumNumberOfSubContours: 2,
      longShortAxisRatio: 1.3,
      maximumNumberOfContourPoints: 4,
      blackRatioBetweenTwoEyes: 0.3,
    };
    

    识别标记点效果

    4-识别标记点.jpg

    绿色方框代码如下

    Imgproc.drawContours(src1, eyes, -1, Scalar(0, 255, 0, 255), thickness, 8);
    

    标记点分类

    图中识别了四个标记点, 但是我们想要的只是中间二维码的三个标记点, 如何对标记点分类?
    我们只识别图片最中间的二维码.
    思路

    5-是否同一个二维码.png

    获取最中心的标记点

    1- 计算横排最多有多少个标记点
    2- 计算纵列最多有多少个标记点
    3- 横排最多就用横排, 纵列多就用纵列
    4- 如果横排比纵列的标记点多, 那么标记点按横坐标排序
    5- 取排序后的标记点数组, 中间的值

    function getCenterEye(eyes) {
      let len = eyes.length;
      return eyes[Math.floor(len / 2)];
    }
    

    比较定位点之间的黑色占比

    其他定位点, 统一和中心的定位点对比

    function classifyEyes(img, eyes) {
      sortEyes(eyes);
      let centerEye = getCenterEye(eyes);
      let classA = [centerEye];
      let classB = [];
      var len = eyes.length;
      for (var i = 0; i < len; i++) {
        let eye = eyes[i];
        if (eye.num == centerEye.num) {
          continue;
        }
        let ratio = getsTheRatioOfBlackAndWhiteBetweenTwoEyes(img, eye, centerEye);
        if (ratio > config.blackRatioBetweenTwoEyes) {
          classA.push(eye);
        } else {
          classB.push(eye);
        }
      }
      return {
        classA: classA,
        classB: classB,
      };
    }
    

    计算定位点黑色占比前, 需要二值化图片

    let imgGray = images.grayscale(img);
    let imgThreshold = images.adaptiveThreshold(imgGray, 255, "MEAN_C", "BINARY", 21, 7);
    

    找色的时候, 又要把二值图改为rgb图

    imgThreshold = images.cvtColor(oldImgThreshold, "GRAY2RGBA");
    

    到了这一步, 定位点就区分开了, 我们把定位点绘制出来

    for (var i = 0; i < len; i++) {
      let eye = classA[i];
      Imgproc.rectangle(
        img.mat,
        new Point(eye.boundingRect.tl.x, eye.boundingRect.tl.y),
        new Point(eye.boundingRect.br.x, eye.boundingRect.br.y),
        new Scalar(0, 0, 255, 255),
        6
      );
    
      let text_size = Imgproc.getTextSize("" + eye.num, fontFace, fontScale, thickness, null);
    
      Imgproc.putText(
        img.mat,
        "" + eye.num,
        Point(eye.cx - text_size.width / 2, eye.h / 4 + eye.boundingRect.br.y + text_size.height),
        fontFace,
        fontScale,
        new Scalar(0, 0, 255, 255),
        thickness
      );
    }
    

    提高二维码识别率第一步: 标记定位点, 大功告成oy

    名人名言

    思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
    --- 牙叔教程

    声明

    部分内容来自网络
    本教程仅用于学习, 禁止用于其他用途

    相关文章

      网友评论

          本文标题:autojs提高二维码识别率(一)-标记定位点

          本文链接:https://www.haomeiwen.com/subject/lhmydrtx.html