Skip to content

Commit beed5d4

Browse files
authored
add gender detection to the FRLG summary reader (#1183)
1 parent f0c539c commit beed5d4

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

SerialPrograms/Source/PokemonFRLG/Inference/PokemonFRLG_StatsReader.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
1212
#include "CommonFramework/Tools/GlobalThreadPools.h"
1313
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
14+
#include "CommonFramework/ImageTools/ImageStats.h"
1415
#include "CommonTools/Images/ImageFilter.h"
1516
#include "CommonTools/Images/ImageManip.h"
1617
#include "CommonTools/OCR/OCR_NumberReader.h"
@@ -131,6 +132,7 @@ StatsReader::StatsReader(Color color)
131132
: m_color(color), m_box_nature(0.028976, 0.729610, 0.502487, 0.065251),
132133
m_box_level(0.052000, 0.120140, 0.099000, 0.069416),
133134
m_box_name(0.163158, 0.122917, 0.262811, 0.066639),
135+
m_box_gender(0.430769, 0.114423, 0.034615, 0.081731),
134136
m_box_hp(0.815558, 0.131247, 0.173049, 0.065251),
135137
m_box_attack(0.891000, 0.245089, 0.097607, 0.063862),
136138
m_box_defense(0.891000, 0.325612, 0.097607, 0.066639),
@@ -175,6 +177,34 @@ void StatsReader::read_page1(
175177
stats.name = name_result.results.begin()->second.token;
176178
}
177179

180+
// Detect gender by comparing red vs blue pixels
181+
ImageViewRGB32 gender_box = extract_box_reference(game_screen, m_box_gender);
182+
183+
const bool replace_color_within_range = false;
184+
const ImageRGB32 red_region = filter_rgb32_range(
185+
gender_box,
186+
combine_rgb(150, 0, 0), combine_rgb(255, 100, 100), Color(0), replace_color_within_range
187+
);
188+
const size_t num_red_pixels = image_stats(red_region).count;
189+
190+
const ImageRGB32 blue_region = filter_rgb32_range(
191+
gender_box,
192+
combine_rgb(0, 0, 180), combine_rgb(130, 130, 255), Color(0), replace_color_within_range
193+
);
194+
const size_t num_blue_pixels = image_stats(blue_region).count;
195+
196+
const double threshold = gender_box.width() * gender_box.height() * 0.1;
197+
198+
if (num_red_pixels > threshold){
199+
stats.gender = SummaryGender::Female;
200+
}else if (num_blue_pixels > threshold){
201+
stats.gender = SummaryGender::Male;
202+
} else {
203+
stats.gender = SummaryGender::Genderless;
204+
}
205+
206+
207+
178208
ImageViewRGB32 level_box = extract_box_reference(game_screen, m_box_level);
179209

180210
ImageRGB32 level_upscaled =

SerialPrograms/Source/PokemonFRLG/Inference/PokemonFRLG_StatsReader.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,17 @@ class VideoOverlaySet;
2323
namespace NintendoSwitch{
2424
namespace PokemonFRLG{
2525

26+
27+
enum class SummaryGender{
28+
Male,
29+
Female,
30+
Genderless
31+
};
32+
2633
struct PokemonFRLG_Stats{
2734
std::string nature;
2835
std::optional<unsigned> level;
36+
std::optional<SummaryGender> gender;
2937
std::string name;
3038
std::optional<unsigned> hp;
3139
std::optional<unsigned> attack;
@@ -58,6 +66,7 @@ class StatsReader {
5866
ImageFloatBox m_box_nature;
5967
ImageFloatBox m_box_level;
6068
ImageFloatBox m_box_name;
69+
ImageFloatBox m_box_gender;
6170
ImageFloatBox m_box_hp;
6271
ImageFloatBox m_box_attack;
6372
ImageFloatBox m_box_defense;

SerialPrograms/Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_ReadStats.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,18 @@ void ReadStats::program(
6363
VideoSnapshot screen1 = env.console.video().snapshot();
6464
reader.read_page1(env.logger(), LANGUAGE, screen1, stats);
6565

66+
std::string gender_strings[] = {"Male", "Female", "Genderless"};
67+
6668
env.log("Name: " + stats.name);
6769
env.log("Level: " +
6870
(stats.level.has_value() ? std::to_string(*stats.level) : "???"));
6971
env.log("Nature: " + stats.nature);
72+
env.log("Gender: " + std::string(
73+
stats.gender.has_value() ? (
74+
(stats.gender == SummaryGender::Male) ? "Male" : (
75+
(stats.gender == SummaryGender::Female) ? "Female" : "Genderless"
76+
)
77+
) : "???"));
7078

7179
env.log("Navigating to Page 2 (POKEMON SKILLS)...");
7280
pbf_press_dpad(context, DPAD_RIGHT, 100ms, 100ms);

0 commit comments

Comments
 (0)