Skip to Content
Frontend화면 인식 기반 포켓몬 앱과 불확실한 수치 처리
🎨 Frontend2026년 10월 17일

화면 인식 기반 포켓몬 앱과 불확실한 수치 처리

#android#ocr#overlay#pokemon-go
PogoAtlas API와 웹 구축3 / 3
포켓몬 GO 화면을 읽어 IV 후보와 보유 개체를 비교하는 Android 앱을 만들었습니다. 화면 인식의 불확실성과 로컬 기록, 오버레이 UI와 APK 배포를 정리합니다.

포켓몬 GO 화면의 CP와 HP 등을 읽어 보유 개체와 비교하는 Android 앱을 만들었습니다. 화면을 읽는 방식이므로 게임의 고유 개체 ID나 확정된 능력치를 직접 받는 것과는 다릅니다.

IV는 포켓몬 개체마다 다른 능력치 값입니다. 화면에 표시된 수치로 가능한 조합을 좁힐 수 있지만, 단서가 부족하면 여러 후보가 남습니다. 앱에서도 모르는 값을 하나의 정답으로 채우지 않는 것을 기준으로 뒀습니다.

화면 인식 결과와 보유 개체 구분

화면 공유 동의를 받은 뒤 MediaProjection으로 캡처를 시작했습니다. 캡처 순간에는 오버레이가 이미지에 섞이지 않도록 숨겼습니다. 자동 모드에서는 연속해서 읽은 값이 일치하는지 확인해 인식 결과를 임시로 저장했습니다. 내 포켓몬 보관함에는 사용자가 확인하고 저장하도록 구분했습니다.

같은 숫자가 나와도 같은 개체라고 판단하지는 않았습니다. 기존 개체를 수정할 때는 사용자가 선택한 로컬 DB 항목에만 적용하고 이전 인식 기록도 남겼습니다. 화면 인식 결과와 사용자가 관리하는 개체 기록을 구분한 것입니다.

수치별 인식 방법

CP와 최대 HP, 평가 막대, 강화 비용, 캔디 계열과 레벨 게이지를 조합해 후보를 좁혔습니다. 이 과정에서는 화면에서 비슷하게 보이는 숫자의 의미도 확인해야 했습니다. 보유한 모래 총량은 강화 비용이 아니고, 사용자가 붙인 태그는 능력치의 근거가 아닙니다.

단서주의할 점
CP·HP여러 IV 조합에서 같은 값이 나올 수 있음
강화 비용보유 재화와 구분
레벨 게이지화면 위치와 장식의 영향
폼수치만으로 일반·의상을 구분하지 못할 수 있음
이전 인식 결과다음 보정의 정답으로 자동 사용하지 않음

확정할 수 없는 경우에는 능력치와 퍼센트 범위를 보여줬습니다. 일부 이미지 비교 규칙을 추가했지만 모든 배경과 종을 인식하는 모델로 다루지는 않았습니다.

오버레이 화면 구성

초기 화면에서는 순위와 버튼이 많은 공간을 차지했습니다. 시안을 검토하며 여백과 설명을 줄이고, 한 줄 도구와 용도별 순위, 상세 비교를 같은 오버레이에서 볼 수 있게 정리했습니다.

시안의 예시 수치와 실제 구현은 구분했습니다. 검토한 화면을 모두 기능으로 추가한 것은 아닙니다. 작은 창에서도 어떤 값을 읽었고 어떤 비교를 하는지 확인할 수 있도록 구성을 줄였습니다.

인식 결과 확인과 보관함 저장

현재 구성에서는 스캔 결과를 임시로 보관하고, 사용자가 확인한 뒤 보관함에 저장합니다. 연속 프레임에서 같은 결과가 나오면 반복해서 저장하지 않습니다. 같은 화면이 확인 목록에 계속 쌓이는 것을 막기 위해서입니다. 보관함의 같은 개체를 자동으로 찾아 병합하는 기능과는 다릅니다.

text
example/recognition-flow.txt
화면·사진 → 기기 OCR → 임시 관측 ├─ 수치 불확실 → 후보·범위·편집 ├─ 필수값 확인 → 새 개체 저장 └─ 보유 후보 있음 → 사용자가 대상 선택 후 수정

현재 저장 필수값은 포켓몬·폼, CP, 최대 HP, 개별 IV, 레벨입니다. IV 0은 유효한 값일 수 있으므로 “읽지 못함”을 0으로 채우면 실제 후보를 바꿉니다. 레벨 범위만 남았을 때도 그 중간값을 확정 레벨로 저장하지 않습니다.

예를 들어 CP와 HP가 같고 IV까지 같은 두 포켓몬이 있을 수 있습니다. 화면에서 얻은 값은 게임 고유 ID가 아니므로 같은 수치라는 이유만으로 기존 개체를 덮어쓰지 않습니다. 선택한 로컬 ID를 수정하고 이전 인식 기록을 남겨야 사용자가 어느 개체를 바꿨는지 되돌아볼 수 있습니다.

사진 인식과 오버레이의 차이

사진을 불러와 읽으면 화면 캡처 권한을 받거나 게임 위에 오버레이를 띄우지 않고도 인식 결과를 확인할 수 있습니다. 기본 오버레이는 화면을 읽을 때 결과 카드를 잠깐 숨겨 자기 화면이 다시 OCR에 들어가지 않도록 합니다. 반면 지원 기기의 단일 앱 캡처에서는 선택한 앱만 들어오므로 오버레이 숨김 방식도 달라집니다.

순위는 서버 자료의 종·폼 기준 참고값입니다. 인식한 개체의 IV와 레벨, 실제 기술을 모두 반영한 개인 전투 성능으로 바꾸어 읽지 않도록 했습니다. 맥스 폼 자료가 있다는 것도 현재 개체가 참가 가능한 상태라는 의미는 아닙니다.

소스 빌드와 확인 범위

현재 저장소는 JDK 17, Android SDK 35와 Gradle Wrapper를 기준으로 빌드합니다. 아래는 저장소 README에 있는 개발 명령입니다.

bash
example/build-pogo-android.sh
./gradlew :app:assembleDebug ./gradlew :app:testDebugUnitTest :app:lintDebug

Windows에서는 gradlew.bat을 사용합니다. 테스트와 lint가 통과해도 화면 공유 권한과 터치, 기기별 글자 크기·배경에서의 OCR까지 확인한 것은 아닙니다. 필수값 누락과 후보의 의미는 코드로 확인하고, 캡처와 저장 흐름은 실제 기기에서 따로 봅니다.

사진의 글자 인식(OCR)은 기기에서 처리하고 원본 스크린샷은 보관함 DB에 넣지 않습니다. 후보 계산과 참고 자료 조회에는 수치가 사용됩니다. 보관함은 기기 SQLite에 있으며 현재 계정 동기화·내보내기는 제공하지 않습니다. 개인 보관함을 복원하려면 기기의 DB도 필요하므로, 소스와 APK만 보관해서는 복원할 수 없습니다.

APK 배포와 저장소 이전

0.2.22에서는 서명과 빌드 결과, 다운로드한 파일의 일치를 확인했습니다. 최신 안내 페이지가 예전 파일을 가리키는 문제가 있어 고정 다운로드 페이지로 정리했습니다.

이후 Android 전용 저장소로 옮기면서 기존 파일과 새 기준선을 비교했습니다. 저장소 이전은 새 앱 버전이나 APK 출시와 다른 변경입니다. 실기기 동작은 이후 직접 확인했습니다.

사진과 화면에서 읽은 값을 바로 보관함에 덮어쓰지 않고, 사용자가 확인한 뒤 저장하는 앱으로 정리했습니다. APK의 서명과 배포 파일을 확인했고 저장소 이전 후에는 제 기기에서 동작도 확인했습니다. 다른 기기의 OCR·권한 요청·터치 동작까지 확인한 것은 아니며, 보관함의 계정 동기화와 내보내기도 아직 제공하지 않습니다.

참고 자료

Last updated on