autojsチェスはポーンを認識します

おじさんの歯のチュートリアルはシンプルで理解しやすいです

問題解決の第一原理

質問を書き留めます

元の画像

飽和

明度

グレースケール

各次元の写真に違いはありません、

元の画像を使用するだけ

ハフは円を見つけます

円の位置は基本的に正しいことがわかりますが、若干のずれがありますが、

円をより正確にするという考え

上の写真で円が見つかりました。この円をもとに、輪郭や文字の色で円のずれを補正しています。

理論的には、円の位置を修正することができますが、これはこの記事の焦点では​​なく、参照用です。

チェスの駒のスクリーンショット

上の写真はすべての作品のスクリーンショットです。作品を選択すると、四隅に赤い看板が表示されます。

写真の検索に支障をきたす可能性があるため、チェスの駒のスクリーンショットの半径を小さくします

私が行っていないことが1つあることがわかりました。それは、写真がどのチェスの駒であるかということです。

これは、円の位置から計算する必要があります

円の縦座標に大きな違いがない限り、それらは同じ行にあると見なされます

すべてのラウンドは6つのグループに分けられ、最下層+中砲+5番目のポーンです。

  • 赤の広場3グループ
  • 黒3グループ

円をトラバースし、最初の円を開始点として、縦座標に従って他の円と比較します。

差が大きくない場合は1つのクラスに分類され、そうでない場合は他のクラスに分類されます。

最後に、縦座標に従って並べ替え、6つの円のグループを分離します。

グループ化が完了し、グループ化は下の縦座標で並べ替えられます。

pieceGroups.sort(function (pieceGroup1, pieceGroup2) {
  let piece1 = pieceGroup1[0];
  let piece2 = pieceGroup2[0];
  if (piece1.circle.y < piece2.circle.y) {
    return -1;
  } else if (piece1.circle.y > piece2.circle.y) {
    return 1;
  } else {
    return 0;
  }
});
复制代码

各チェスグループの後、横軸に従って並べ替える必要があります

for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  pieceGroup.sort(function (piece1, piece2) {
    if (piece1.circle.x < piece2.circle.x) {
      return -1;
    } else if (piece1.circle.x > piece2.circle.x) {
      return 1;
    } else {
      return 0;
    }
  });
}
复制代码

チェスの駒の写真を再トリミングし、チェスの駒の名前を記録します。

色は一時的に写真によるもので、上が黒、下が赤、

後の最適化では、色は画像上で複数のポイントを取ることができ、民主的な投票、

投票数が最も多い色はその色です

このチュートリアルの焦点では​​なく、アイデアは参照用です

for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  for (var j = 0; j < pieceGroup.length; j++) {
    let piece = pieceGroup[j];
    let circle = piece.circle;
    let checkPieceArea = calculateCheckPieceArea(img, circle);
    let chessPieceImg = clipChessPieceImg(img, checkPieceArea);
    let color;
    if (count < 15) {
      color = "黑";
    } else {
      color = "红";
    }
    let filePath = dir + "/" + piece.num + "-" + color + "-" + pieceNames[count] + ".png";
    log(filePath);
    files.createWithDirs(filePath);
    images.save(chessPieceImg, filePath);
    chessPieceImg.recycle();
    count++;
  }
}
复制代码

すべての準備ができています、それを確認してください、

検証手順

  1. チェスでいくつかのステップを踏みます
  2. スクリーンショット
  3. 認識結果を表示する

別の問題が見つかりました、重複した部分がありました、

最初からやり直して、重複する部分を削除します

for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  for (var j = 0; j < pieceGroup.length; j++) {
    let piece = pieceGroup[j];
    let circle = piece.circle;
    let checkPieceArea = calculateCheckPieceArea(img, circle);
    let chessPieceImg = clipChessPieceImg(img, checkPieceArea);
    let color;
    if (count <= 15) {
      color = "黑";
    } else {
      color = "红";
    }
    let archivedPiece = archivedPieces[color + pieceNames[count]];
    if (archivedPiece) {
      // 重复的棋子, 只留下一个
      count++;
      continue;
    } else {
      archivedPieces[color + pieceNames[count]] = 1;
    }
    let filePath = dir + "/" + piece.num + "-" + color + "-" + pieceNames[count] + ".png";
    files.createWithDirs(filePath);
    images.save(chessPieceImg, filePath);
    chessPieceImg.recycle();
    count++;
  }
}
复制代码

この時点で、チェスの駒の写真が14枚あるはずです。

チェスをもう一度認識し、認識した後、緑色のテキストを書きます

for (var i = 0; i < pieces.length; i++) {
  let piece = pieces[i];
  var points = images.matchTemplate(img, piece.img, {
    threshold: 0.9,
  }).points;
  if (points) {
    points.forEach((point) => {
      canvas.drawText(piece.name, point.x, point.y, textPaint);
    });
  }
}
复制代码

すべて正しく識別された

テスト環境

電話:Mi 11 Pro
Androidバージョン:12
Autojsバージョン:9.1.13

有名な名言

アイデアは最も重要であり、他のBaidu、bing、stackoverflow、github、Androidドキュメント、autojsドキュメント、そして最後に尋ねるグループ---UncleToothチュートリアル

ステートメント

コンテンツの一部はインターネットからのものです。このチュートリアルは学習のみを目的としており、他の目的で使用することは禁止されています\

WeChatパブリックアカウントの歯のおじさんのチュートリアル

おすすめ

転載: juejin.im/post/7082775328896057352