おじさんの歯のチュートリアルはシンプルで理解しやすいです
問題解決の第一原理
質問を書き留めます
元の画像
飽和
明度
グレースケール
各次元の写真に違いはありません、
元の画像を使用するだけ
ハフは円を見つけます
円の位置は基本的に正しいことがわかりますが、若干のずれがありますが、
円をより正確にするという考え
上の写真で円が見つかりました。この円をもとに、輪郭や文字の色で円のずれを補正しています。
理論的には、円の位置を修正することができますが、これはこの記事の焦点ではなく、参照用です。
チェスの駒のスクリーンショット
上の写真はすべての作品のスクリーンショットです。作品を選択すると、四隅に赤い看板が表示されます。
写真の検索に支障をきたす可能性があるため、チェスの駒のスクリーンショットの半径を小さくします
私が行っていないことが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++;
}
}
复制代码
すべての準備ができています、それを確認してください、
検証手順
- チェスでいくつかのステップを踏みます
- スクリーンショット
- 認識結果を表示する
別の問題が見つかりました、重複した部分がありました、
最初からやり直して、重複する部分を削除します
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パブリックアカウントの歯のおじさんのチュートリアル