Enregistrez votre aventure Ringfit avec OCR

Cet article est le 6ème jour du calendrier de l'Avent Aratana. 68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3135303435352f65373962613531662d303136332d323436622d616437622d3939386638663434326437322e706e67.png

Vous avez une aventure de ring fit? Je veux tout gâcher, mais ça s'arrête en moins de 30 minutes. À la fin de la pièce, il y aura un enregistrement de combien d'exercice j'ai pu faire cette fois, mais je prendrai une photo avec mon smartphone là-bas. (Une personne qui est nouvelle sur Switch et ne savait pas que la capture d'écran est possible) ↓ C'est celui-là rfa.jpg

Je ne le sais peut-être pas car je suis un débutant de Switch, mais il semble que je n'ai pas pu exporter le disque. Je voulais un certain nombre d'efforts que j'ai pu faire, alors cette fois, je vais essayer d'enregistrer en utilisant l'OCR qui transcrira à partir de la photo.

Préparation

brew install tesseract
pip install pyocr

Entraine toi

Utilisez pyocr pour encapsuler l'outil OCR open source Tesseract. Pour le moment, chargez l'image et appliquez l'OCR.

from PIL import Image

import pyocr
import pyocr.builders


image = Image.open("image_path")

tools = pyocr.get_available_tools()

tool = self.tools[0]

result_ocr = self.tool.image_to_string(
    image,
    lang="jpn",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6))

print(result_ocr.splitlines())
Les mouvements d'aujourd'hui

Lien Consqueeze_

S'accroupir
-Poussée de campagne
Tony Touchest

-Pose de chaise

Poussée sur le ventre

_ /② Équipe ② Temps

⑥ 0 fois(eom
③ ⑧ fois(③⑧4)
③ ① fois G 4
② ② fois(② ② cause)

⑤ fois ⑤ quatre

-② Cause ② fois

Fringant

Jinging

Âge de la pêche
en marchant

Touche de commande de l'anneau vers le bas

m ⑤ Par

Imprimer la surface de la peinture

⑥⑤⑦m(⑥⑤zm)

-M(④⑤⑧m

⑨⑨m(gom)
_②m(②m)
⑯ Automne ⑯ Gong

-⑤(⑥ Gong

Gorge 0




C'est terrible! C'est terrible, mais pour le moment, l'OCR en lui-même est un succès, alors ...

Je m'inquiète de l'espace entre les lettres, la prochaine fois je gérerai cet espace. Il semble y avoir une option dans tesseract qui vous permet de remplir les blancs. -c preserve_interword_spaces=1

J'ai trouvé une description qui spécifie l'option de la source de pyocr, donc je vais l'utiliser.

builder = pyocr.builders.TextBuilder(tesseract_layout=6)
builder.tesseract_configs.append('-c')
builder.tesseract_configs.append('preserve_interword_spaces=1')
Résultat total de l'exercice d'aujourd'hui

Linkcon écraser_

S'accroupir
-Bapanzai Push
Tony à la poitrine

-Pose de la chaise

Poussez votre ventre

_ /② groupe ② fois

⑥ 0 fois(eom
③ ⑧ fois(③⑧4)
③ ① fois G4
②② fois(② ② cause)

⑤ fois ⑤ quatre

-② Cause ② fois

Tiret

le jogging

Élevez la pêche
en marchant

Ringcon push down keep

m ⑤ par

圓 Écran

⑥⑤⑦m(⑥⑤zm)

-M(④⑤⑧m

⑨⑨m(gom)
_②m(②m)
⑯Automne ⑯Gong

--- ⑤(⑥ Gong

Gorge 0 Fermer avec une corde

 

Il n'y a pas d'espaces entre les caractères.

Je suis préoccupé par l'exactitude de l'OCR lui-même. Ajoutons le prétraitement pour le moment. Au fait, j'ai changé de splitline () en split () car il n'y avait pas d'espace supplémentaire.

im_blur = cv2.GaussianBlur(image, (5, 5), 0)
_, image = cv2.threshold(im_blur, 0, 255, cv2.THRESH_OTSU)

J'ai ajouté la suppression du bruit et le traitement de binarisation Otsu avec un filtre gaussien.

Le premier est avant split () et le second est après split ().


Le confort total du résultat d'aujourd'hui`Creuser l'écran
.. Anneau de commande enfoncé ⑦② fois(⑦ ② 4)・ Dash ⑥ ⑤ ⑦ m(⑥⑤⑦m)
«Squat» 0 fois(⑥ol)・ Jogging ④③⑧m(④③⑧m)
`Bansazai Push ③⑧ fois(③ ⑧ 吏)   *Pêche Akage ⑨⑨m(⑨⑨m)
Nee to Chest ③ ① fois(③ ① i groupe)・ Marche ②m(②m)
・ Pose de la chaise ②② fois(② ② 4)・ Ringcon push down keep ⑯Autumn ⑯)
Pousser l'estomac ⑤ fois(⑤ Quatre).. Donjon à tirer Ringcon ⑥ Automne(⑥ vous)
・ Appuyez sur l'anneau de commande ② fois(② fois)
_La valeur entre parenthèses est la valeur cumulée depuis le début de la lecture [`.. <fermer
‥*Leh Talk Shisho Kopu-Discours de deuil e

['Résultat total d'aujourd'hui', 'Consolation', 'Yasu', '`', 'Creuser l'écran', '。', 'Commande de l'anneau poussoir', '⑦② fois(⑦ ② 4)',
'・', 'tiret', '⑥⑤⑦m(⑥⑤⑦m)', '“', 'S'accroupir', '⑥ 0 fois(⑥ol)', '・', 'le jogging', '④③⑧m(④③⑧m)',
'`', 'Bansazai Push', '③ ⑧ fois(③ ⑧ 吏)', '*', 'Pêche Akege', '⑨⑨m(⑨⑨m)', 'Ya', 'Du genou à la poitrine'
, '③ ① fois(③ ① i groupe)', '・', 'en marchant', '②m(②m)', '・', 'Pose de chaise', '②② fois(② ② 4)', '・', 'bague
Continuez à pousser l'ordinateur', '⑯ Automne ⑯ rôle)', 'Shu', 'Poussée sur le ventre', '⑤ fois(⑤ Quatre)', '。', 'Clé de traction Ringcon
Pub', '⑥ Automne(⑥ vous)', '・', 'Appuyez sur l'anneau de commande', '② fois(② fois)', '_', 'Les nombres entre parenthèses représentent l'accumulation depuis le début du jeu
C'est le prix total', '〔`。〈', 'Fermer', '‥*', 'Leh parle Shisho Kopu', '-', '-', '・ Discours de deuil e']

Vous pouvez maintenant voir le type et le nombre d'exercices en regardant le putt. Il semble que 1 est comme ① dans les spécifications de tesseract, alors j'ai pensé que j'écrirais le processus de mappage dans le programme, mais il y avait une fonction qui pouvait être utilisée, alors j'ai essayé de l'utiliser.

unicodedata.normalize()

Après cela, sortez l'exercice et le nombre de fois.

target_list = [
            "S'accroupir", "Poussez l'anneau contrôleur", "tiret", "le jogging", "Banzai Push", "Élevez la pêche",
            "Du genou à la poitrine", "en marchant", "Pose de chaise", "Ringcon push down keep", "Poussée sur le ventre",
            "Gâche de traction Ringcon", "Appuyez sur l'anneau de commande"
        ]

result = []
for target in target_list:
    s = []
    for j, line in enumerate(texts):
        s.append(
            difflib.SequenceMatcher(a=target, b=line).ratio())

    result.append(texts[s.index(max(s)) + 1].split('(')[0])


Voici ce que j'ai ajouté à chaque fois que je l'ai exécuté à la fin.


{
    "0": {
        "S'accroupir": "60 fois",
        "Poussez l'anneau contrôleur": "72 fois",
        "tiret": "657m",
        "le jogging": "438m",
        "Banzai Push": "38 fois",
        "Élevez la pêche": "99m",
        "Du genou à la poitrine": "31 fois",
        "en marchant": "2m",
        "Pose de chaise": "22 fois",
        "Ringcon push down keep": "16 rôles d'automne 16)",
        "Poussée sur le ventre": "5 fois",
        "Gâche de traction Ringcon": "6 automne",
        "Appuyez sur l'anneau de commande": "Deux fois"
    },
    "1": {
        "S'accroupir": "60 fois",
        "Poussez l'anneau contrôleur": "72 fois",
        "tiret": "657m",
        "le jogging": "438m",
        "Banzai Push": "38 fois",
        "Élevez la pêche": "99m",
        "Du genou à la poitrine": "31 fois",
        "en marchant": "2m",
        "Pose de chaise": "22 fois",
        "Ringcon push down keep": "16 rôles d'automne 16)",
        "Poussée sur le ventre": "5 fois",
        "Gâche de traction Ringcon": "6 automne",
        "Appuyez sur l'anneau de commande": "Deux fois"
    }
}

Comme il a été exécuté avec la même image, il a été enregistré le même nombre de fois les deux fois, mais j'ai pu l'ajouter. " Ringcon push down keep ":" 16 automne 16 rôles) ", Il y a certaines parties que je ne pouvais pas obtenir proprement ou je ne pouvais pas reconnaître les «temps», mais j'en suis content.

Résumé

Cette fois, la partie ocr était complètement sur le pyocr (tesseract), donc je n'ai pas réfléchi à la façon d'améliorer les «temps» ci-dessus comme «automne», mais la prochaine fois j'améliorerai la précision de la reconnaissance. Je veux l'essayer.

Mais que dois-je faire quand j'essaye ocr pour la première fois et qu'il y a un étrange blanc ...? Si vous ne prétraitez pas, la précision ne s'améliorera pas ...? C'était amusant et éducatif de réfléchir à la façon de gérer chaque fois que je frappais un mur.

Je voudrais ajouter quelques fonctions supplémentaires telles que la sortie csv et la sortie de valeur totale.

Recommended Posts

Enregistrez votre aventure Ringfit avec OCR
L'histoire de vouloir acheter une aventure en forme de bague
Derrière le bot d'arrivée Ringfit Adventure pour éradiquer les revendeurs