質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

974閲覧

携帯でスクショしたものから、文字認識を行いたい。

Winter_1214

総合スコア11

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/10/05 16:53

編集2022/10/05 17:22

実現したいこと・発生している問題・試したこと

今回はイカリング3の下記画像からユーザー名、塗りポイント、KDSのデータを取得した。
イメージ説明(画像はお借りしています。)

文字の認識までは行えたが、iphone 13 pro maxのスクショの画像で行っていたため、他のiphone 13 proでのスクショの画像ではずれてしまったため、どの解像度の画像が来ても、取得できるようにしたい。
他の方法で、テキスト描写域を取得してから行う方法では、取得できない部分があり断念した。

何かいい方法がありましたら、教えていただきたいです。よろしくお願いします。

該当のソースコード

py

1path='C:\\Program Files\\Tesseract-OCR\\' 2os.environ['PATH'] = os.environ['PATH'] + path 3pyocr.tesseract.TESSERACT_CMD = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 4engines = pyocr.get_available_tools() 5engine = engines[0] 6point = [[170,718,490,772],[820,720,973,775],[973,720,1235,772], 7 [170,875,490,942],[820,885,973,945],[973,885,1235,942], 8 [170,1045,490,1110],[820,1050,973,1112],[973,1050,1235,1110], 9 [170,1208,490,1268],[822,1212,973,1268],[973,1212,1235,1265], 10 [170,1476,490,1535],[820,1485,973,1538],[973,1485,1235,1535], 11 [170,1648,490,1700],[820,1648,973,1704],[973,1648,1235,1700], 12 [170,1808,490,1865],[820,1812,973,1868],[973,1812,1235,1865], 13 [170,1974,490,2035],[820,1978,973,2038],[973,1978,1235,2035] 14 ] 15file_name = "aaa.png" 16spl_data_list = [] 17for i in range(len(point)): 18 txt = engine.image_to_string( 19 Image.open(file_name).crop((point[i][0],point[i][1],point[i][2],point[i][3])), 20 lang="ikaltoon", 21 builder=pyocr.builders.TextBuilder() 22 ) 23 spl_data_list.append(txt) 24 with open(r"ocr_result.txt", "a",encoding="utf-8",errors="ignore") as f:#w 25 print(txt, file=f) 26 27 img = cv2.imread(file_name) 28 img = cv2.rectangle(img, (point[i][0],point[i][1]),(point[i][2],point[i][3]), (255, 0, 0), 3, 4) 29 cv2.imwrite(file_name, img)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2022/10/05 19:56 編集

「どの解像度の画像が来ても、取得できるようにしたい」と考えて試した/実装したことは,どのようなことになりますでしょうか?可能であれば「テキスト描写域を取得してから行う方法では、取得できない部分があり断念した」という部分も掲載いただけるとアドバイスの域が広がると思います.取得できない部分に規則性や,取得できた部分からの相対性をつかむことができれば問題なく実装できる気もします. 現状,固定のピクセル値を用いてハードコーディングされているように見えますが,これを可変にしたいということですよね?
Winter_1214

2022/10/06 04:40

返信が遅くなってしまい、申し訳ありません。コメントありがとうございます。 アンドロイドでのスクショとiphoneでのスクショで取得しようとしました。実装しようと思い、url(https://onl.bz/QQZbamW)この方のを参考にしていましたが、取得できない部分があり、断念しました。 そうです。ピクセル値を可変したいということで会っています。
guest

回答1

0

ベストアンサー

過去のikaWidget2のようにNintendoの非公開APIを叩いて統計データを取得する方法があります.

今作は特に,前作と比べて戦績に関するデータが多く,KDSだけでなくメダル情報なども欲しいところだと考えます.データの多さからスクショの範囲が増えるのは不便だと思いますし,従来の文字認識限定のコードではできないようなブキ情報等も同時に取得できますので,APIを叩いてデータを取得する方が圧倒的おすすめ手法になります.

実際のデータの一部を掲載しておきます.

json

1{ 2 "data": { 3 "vsHistoryDetail": { 4 "__typename": "VsHistoryDetail", 5 "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 6 "vsRule": { 7 "name": "Turf War", 8 "id": "xxxxxx", 9 "rule": "TURF_WAR" 10 }, 11 "vsMode": { 12 "mode": "REGULAR" 13 }, 14 "judgement": "WIN", 15 "myTeam": { 16 "judgement": "WIN", 17 "result": { 18 "paintRatio": 0.505, 19 }, 20 "players": [ 21 { 22 "name": "xxxxxx", 23 "weapon": { 24 "name": "Splattershot", 25 "subWeapon": { 26 "name": "Suction Bomb", 27 } 28 }, 29 "species": "INKLING", 30 "__isPlayer": "VsPlayer", 31 "headGear": {}, 32 "clothingGear": {}, 33 "shoesGear": {}, 34 "paint": 971, 35 "result": { 36 "kill": 6, 37 "death": 3, 38 "assist": 1, 39 "special": 4, 40 "noroshiTry": null 41 }, 42 "__typename": "VsPlayer" 43 }, 44 { 45 "name": "xxxxx", 46 "weapon": { 47 "name": "Tri-Stringer", 48 "subWeapon": { 49 "name": "Toxic Mist" 50 } 51 }, 52 "species": "INKLING", 53 "__isPlayer": "VsPlayer", 54 "headGear": {}, 55 "clothingGear": {}, 56 "shoesGear": {}, 57 "paint": 794, 58 "result": { 59 "kill": 8, 60 "death": 2, 61 "assist": 4, 62 "special": 3, 63 "noroshiTry": null 64 }, 65 "__typename": "VsPlayer" 66 } 67 ], 68 "order": 1 69 }, 70 "vsStage": { 71 "name": "Mincemeat Metalworks", 72 }, 73 "festMatch": null, 74 "knockout": "NEITHER", 75 "otherTeams": [ 76 77 ], 78 "bankaraMatch": null, 79 "xMatch": null, 80 "duration": 180, 81 "playedTime": "2022-10-05T23:57:33Z", 82 "awards": [ 83 { 84 "name": "#1 Super Jump Spot", 85 "rank": "GOLD" 86 }, 87 { 88 "name": "First Splat!", 89 "rank": "SILVER" 90 }, 91 { 92 "name": "#2 Popular Target", 93 "rank": "SILVER" 94 } 95 ] 96 } 97 } 98}

どうしても画像認識でやりたいのであれば,本解答は無視して大丈夫です.

投稿2022/10/05 19:48

編集2022/10/06 07:59
PondVillege

総合スコア1579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Winter_1214

2022/10/06 04:46

イカリング3もAPIがあるのですか!?!?私が調べた時には、スプラの3のはステージ情報や次のステージなどを取得するもので、私が欲しいようなものを取得するものはありませんでした。スプラ2のはバトルデータなどもありましたが......もし、スプラ3でバトルデータを持ってこれるものがあるのでしたら、教えてほしいです。できれば、画像でできると、有り難いです。
PondVillege

2022/10/06 07:45 編集

> スプラの3のはステージ情報や次のステージなどを取得するもので というのは,https://spla3.yuu26.com/ のことでしょうか.ただこのAPIサービスも同様,自分でNINTENDOの非公開APIを叩いて実装されたものだと思われます. 口先だけにならないよう,こちらでも先ほど非公開APIを叩いて検証したところ,エンドポイント https://api.lp1.av5ja.srv.nintendo.net/api/graphql にリクエストを送ることでバトルデータを取得できました. req.body["data"]["vsHistoryDetail"]["myTeam"]["players"][0]["paint"] が0番目の人の塗りポイント req.body["data"]["vsHistoryDetail"]["myTeam"]["players"][0]["result"] の中にが0番目の人のkill, special, death, assistが入っています. 他にもステージ情報やルール情報のみならず,各プレイヤーのギア情報やブキ情報,勝敗情報や自分が獲得したメダル(awards)とそのrank(GOLD, SILVER)が取得できます.合計で210KiBものJSONファイルになっていました. 画像でやるには,先述の通り,取得できなかったテキスト描写域の共通点やその詳細と実装コードを教えていただければ,何かしらアドバイスができると思います.現状,新しく実装するより,そのときのコードから解決するのが最短ルートになると思います.
Winter_1214

2022/10/06 08:08

url(https://onl.bz/QQZbamW)この方のコードで行いました。取得出来たら、少し自分好みに変更しようかと思ってたんですけど、不可能でした。コードは上記のリンクの人まんまです。 すみません、非公式のAPIを叩いたことがないので、 req.body["data"]["vsHistoryDetail"]["myTeam"]["players"][0]["paint"] が0番目の人の塗りポイント,req.body["data"]["vsHistoryDetail"]["myTeam"]["players"][0]["result"] の中にが0番目の人のkill の取得しているのもののサンプルコードいただいてもよろしいですか?
PondVillege

2022/10/06 09:04 編集

URLの方拝見いたしました.これを使ってもなお,検出文字の数が少なく,検出できた文字間の相対距離や相対位置から,検出できてない文字列の位置を把握できないようなら,他の文字検出ソフトウェアを試すしかないです. もしくは,機種ごとに絶対位置をハードコーディングしてしまう方法があります. > 取得しているのもののサンプルコード APIとの通信内容を取得するためにコードを書いていません.Proxyman https://proxyman.io/posts/2021-10-17-Getting-Started-With-Proxyman-For-iOS というアプリを入れて,HTTPリクエストをキャプチャして得られた情報になります.
Winter_1214

2022/10/06 10:25

Proxymanというアプリはインストールしたのですが、肝心な使用方法がわからないです。もしよろしければ、バトルのデータの取得方法までの流れをお教え頂けますでしょうか?
PondVillege

2022/10/06 10:41 編集

下のタブのmore > VPN > Certificates > 右上の歯車 > Show Guideline で,VPNのインストール手順があるのでこれに沿ってローカルVPNを建てた後,CertificatesのページでVPN runningになっていればあとはNintendo Onlineでスプラのアプリを開くだけです.その瞬間からiPhoneが行った通信内容がProxymanのHomeタブに蓄積されていきます.そこからデータを探すと良いでしょう.終わった後はVPNを終了させることを忘れないようにしないと,iPhoneで通信するたびに無限にデータが溜まっていくので注意してください.
Winter_1214

2022/10/06 11:03

ありがとうございます。アプリでの取得方法はわかりました。このやり方だと、自分の情報しか取れない感じですよね。となると、ほかの人の情報を集めたいとなると、この方法では、実装は無理ですよね....
PondVillege

2022/10/06 11:19 編集

ikaWidget2では初期設定としてユーザに任天堂アカウントへのログインを行わせることで,認証トークンを取得し,そのユーザの戦闘データを獲得することができていました.こうすることで他の人でも自分のデータを集めることができていたのです. ここまでせずとも,Proxymanをインストールしてもらって戦闘データのJSONを「共有」やコピペし,なんらかのアプリにデータを渡すことができると思いますが確かに不便ですね. スクショで実装されるなら,文字を直接探すのではなくて,輪郭検出等の画像処理技術を併用して文字領域を推定するのが良いと思います.
Winter_1214

2022/10/06 11:19

すみません。長々ととても勉強になりました。 輪郭検出の方を勉強してみたいと思います。 本当に、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問