autojs chess reconhece peões

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

  1. Dê alguns passos no xadrez
  2. captura de tela
  3. 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

Acho que você gosta

Origin juejin.im/post/7082775328896057352
Recomendado
Clasificación