autojs chess reconoce peones

Uncle Tooth Tutorial es simple y fácil de entender

primeros principios de resolución de problemas

escribe la pregunta

imagen original

saturación

brillo

escala de grises

No hay diferencia entre las imágenes de cada dimensión,

Solo usa la imagen original

Hough encuentra el círculo

Se puede ver que la posición del círculo es básicamente correcta, pero hay una ligera desviación,

La idea de hacer círculos más precisos.

El círculo se ha encontrado en la imagen de arriba. Sobre la base de este círculo, la desviación del círculo se corrige por el color del contorno o texto.

En teoría, la posición del círculo se puede corregir, lo cual no es el enfoque de este artículo y es solo para referencia.

Captura de pantalla de la pieza de ajedrez

Lo anterior es una captura de pantalla de todas las piezas, cuando se seleccionan las piezas, habrá señales rojas en las cuatro esquinas.

Puede interferir con la búsqueda de la imagen, por lo que hacemos que el radio de la captura de pantalla de la pieza de ajedrez sea más pequeño

Descubrí que hay una cosa que no he hecho, que es qué pieza de ajedrez es la imagen.

Esto debe calcularse a partir de la posición del círculo.

Siempre que las ordenadas de los círculos no sean muy diferentes, se considera que están en la misma fila.

Todas las rondas se dividen en 6 grupos, la capa inferior + el arma del medio + el quinto peón

  • Cuadrado rojo 3 grupos
  • Negro 3 grupos

Recorra el círculo, tome el primer círculo como punto de partida y compare otros círculos con él según la ordenada,

Si la diferencia no es grande, se clasifica en una clase, de lo contrario, se clasifica en otras clases,

Finalmente, ordena según la ordenada y separa los 6 grupos de círculos.

La agrupación se completa y la agrupación se ordena por la ordenada a continuación.

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;
  }
});
复制代码

Después de cada grupo de ajedrez, debe ordenarse según la abscisa

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;
    }
  });
}
复制代码

Vuelva a recortar la imagen de la pieza de ajedrez y registre el nombre de la pieza de ajedrez;

El color es temporalmente de acuerdo con la imagen, el negro está en la parte superior, el rojo está en la parte inferior,

En la optimización posterior, el color puede tomar múltiples puntos en la imagen, votación democrática,

El color con más votos es ese color.

No es el enfoque de este tutorial, las ideas son solo para referencia.

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++;
  }
}
复制代码

Todo está listo, compruébalo,

pasos de verificación

  1. Da unos pasos en el ajedrez
  2. captura de pantalla
  3. Ver resultados de reconocimiento

Se encontró otro problema, había piezas duplicadas,

Empezar todo de nuevo, eliminar las piezas 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++;
  }
}
复制代码

En este punto, debería haber 14 imágenes de piezas de ajedrez.

Reconozca el ajedrez nuevamente y, después del reconocimiento, escriba 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 correctamente

entorno de prueba

Teléfono: Mi 11 Pro
Versión de Android: 12
Autojs Versión: 9.1.13

frases famosas

La idea es la más importante, otros Baidu, bing, stackoverflow, github, documentación de Android, documentación de autojs y, finalmente, el grupo para preguntar ---

Declaración del tutorial del tío Tooth

Parte del contenido es de Internet. Este tutorial es solo para aprender y está prohibido usarlo para otros fines.

Tutorial del tío de los dientes de la cuenta pública de WeChat

Supongo que te gusta

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