O Tutorial do Tio Dente é simples e fácil de entender
primeiros princípios de resolução de problemas
anote a pergunta
imagem original
saturação
brilho
escala de cinza
Não há diferença entre as imagens de cada dimensão,
Basta usar a imagem original
Hough encontra o círculo
Pode-se ver que a posição do círculo está basicamente correta, mas há um pequeno desvio,
A ideia de tornar os círculos mais precisos
O círculo foi encontrado na imagem acima.Com base nesse círculo, o desvio do círculo é corrigido pela cor do contorno ou do texto.
Em teoria, a posição do círculo pode ser corrigida, o que não é o foco deste artigo e é apenas para referência
Captura de tela da peça de xadrez
O acima é uma captura de tela de todas as peças, quando as peças são selecionadas, haverá sinais vermelhos nos quatro cantos
Isso pode interferir na localização da imagem, então reduzimos o raio da captura de tela da peça de xadrez
Descobri que há uma coisa que não fiz, que é qual peça de xadrez é a imagem
Isso deve ser calculado a partir da posição do círculo
Desde que as ordenadas dos círculos não sejam muito diferentes, eles são considerados na mesma linha
Todas as rodadas são divididas em 6 grupos, a camada inferior + a arma do meio + o quinto peão
- Quadrado vermelho 3 grupos
- Preto 3 grupos
Percorra o círculo, tome o primeiro círculo como ponto de partida e compare outros círculos com ele de acordo com a ordenada,
Se a diferença não for grande, é classificado em uma classe, caso contrário, é classificado em outras classes,
Por fim, ordene de acordo com as ordenadas e separe os 6 grupos de círculos.
O agrupamento é concluído e o agrupamento é classificado pela ordenada abaixo.
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;
}
});
复制代码
Após cada grupo de xadrez, ele deve ser ordenado de acordo com a abcissa
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;
}
});
}
复制代码
Recorte a imagem da peça de xadrez e registre o nome da peça de xadrez;
A cor está temporariamente de acordo com a imagem, o preto está na parte superior, o vermelho está na parte inferior,
Na otimização posterior, a cor pode levar vários pontos na imagem, votação democrática,
A cor com mais votos é essa cor
Não é o foco deste tutorial, as ideias são apenas para referência
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++;
}
}
复制代码
Está tudo pronto, verifique,
etapas de verificação
- Dê alguns passos no xadrez
- captura de tela
- Ver resultados de reconhecimento
Outro problema foi encontrado, havia peças duplicadas,
Comece tudo de novo, exclua as peças duplicadas
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++;
}
}
复制代码
Neste ponto, deve haver 14 fotos de peças de xadrez
Reconheça o xadrez novamente e, após o reconhecimento, escreva o texto verde
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);
});
}
}
复制代码
Todos identificados corretamente
ambiente de teste
Telefone: Mi 11 Pro
Android Versão: 12
Autojs Versão: 9.1.13
citações famosas
A ideia é a mais importante, outro Baidu, bing, stackoverflow, github, documentação do Android, documentação do autojs e, finalmente, o grupo a perguntar --- Uncle Tooth Tutorial
Statement
Parte do conteúdo é da Internet. Este tutorial é apenas para aprendizado, sendo proibido usá-lo para outros fins\
Tutorial de tio de dente de conta pública do WeChat