Skip to content

Commit bd734b6

Browse files
author
Gin
committed
add box dex number detector
1 parent 9a6c636 commit bd734b6

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

SerialPrograms/Source/PokemonLZA/Inference/Boxes/PokemonLZA_BoxInfoDetector.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
*
55
*/
66

7+
#include "CommonFramework/ImageTools/ImageBoxes.h"
8+
#include "CommonFramework/ImageTypes/ImageRGB32.h"
79
#include "CommonFramework/ImageTools/ImageStats.h"
810
#include "CommonFramework/VideoPipeline/VideoOverlay.h"
911
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
12+
#include "CommonTools/Images/ImageFilter.h"
13+
#include "CommonTools/OCR/OCR_NumberReader.h"
1014
#include "Kernels/Waterfill/Kernels_Waterfill_Types.h"
1115
#include "CommonTools/ImageMatch/WaterfillTemplateMatcher.h"
1216
#include "CommonTools/Images/WaterfillUtilities.h"
17+
#include "PokemonLZA/Resources/PokemonLZA_AvailablePokemon.h"
1318
#include "PokemonLZA_BoxInfoDetector.h"
1419

1520
namespace PokemonAutomation{
@@ -190,7 +195,40 @@ std::string BoxPageInfoWatcher::info_str() const{
190195
return "Regular";
191196
}
192197

198+
BoxDexNummberDetector::BoxDexNummberDetector(Logger& logger) : m_logger(logger), m_dex_number_box{0.510, 0.203, 0.039, 0.031}, m_dex_type_box{0.472, 0.204, 0.018, 0.030}{}
193199

200+
void BoxDexNummberDetector::make_overlays(VideoOverlaySet& items) const{
201+
items.add(COLOR_GRAY, m_dex_number_box);
202+
items.add(COLOR_GRAY, m_dex_type_box);
203+
}
204+
205+
bool BoxDexNummberDetector::detect(const ImageViewRGB32& screen){
206+
const size_t max_dex_number = std::max(LUMIOSE_DEX_SLUGS().size(), HYPERSPACE_DEX_SLUGS().size());
207+
208+
const int dex_number = OCR::read_number_waterfill(m_logger, extract_box_reference(screen, m_dex_number_box), 0xff808080, 0xffffffff, false);
209+
if (dex_number <= 0 || dex_number > static_cast<int>(max_dex_number)) {
210+
m_dex_number = 0;
211+
m_dex_number_when_error = dex_number;
212+
return false;
213+
}
214+
m_dex_number = static_cast<uint16_t>(dex_number);
215+
m_dex_number_when_error = 0;
216+
217+
// Replacing white background with zero-alpha color so that they won't be counted in
218+
// the following image_stats()
219+
// The white background is defined as the color between 0xffa0a0a0 and 0xffffffff.
220+
const bool replace_color_within_range = true;
221+
ImageRGB32 region = filter_rgb32_range(
222+
extract_box_reference(screen, m_dex_type_box),
223+
0xffa0a0a0, 0xffffffff, Color(0), replace_color_within_range
224+
);
225+
226+
ImageStats stats = image_stats(region);
227+
m_dex_type_color_ratio = stats.count / ((double)region.width() * region.height());
228+
m_dex_type = (m_dex_type_color_ratio > 0.2) ? DexType::LUMIOSE : DexType::HYPERSPACE;
229+
230+
return true;
231+
}
194232

195233
}
196234
}

SerialPrograms/Source/PokemonLZA/Inference/Boxes/PokemonLZA_BoxInfoDetector.h

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Box Info Detector
1+
/* Detectors for various pokemon info on box view
22
*
33
* From: https://github.com/PokemonAutomation/
44
*
@@ -15,6 +15,7 @@
1515
#include "CommonTools/InferenceCallbacks/VisualInferenceCallback.h"
1616

1717
namespace PokemonAutomation{
18+
class Logger;
1819
namespace NintendoSwitch{
1920
namespace PokemonLZA{
2021

@@ -119,6 +120,43 @@ class BoxPageInfoWatcher : public VisualInferenceCallback{
119120
};
120121

121122

123+
enum class DexType{
124+
LUMIOSE,
125+
HYPERSPACE,
126+
};
127+
128+
129+
class BoxDexNummberDetector : public StaticScreenDetector{
130+
public:
131+
BoxDexNummberDetector(Logger& logger);
132+
133+
virtual void make_overlays(VideoOverlaySet& items) const override;
134+
135+
virtual bool detect(const ImageViewRGB32& screen) override;
136+
137+
DexType dex_type() const { return m_dex_type; }
138+
uint16_t dex_number() const { return m_dex_number; }
139+
140+
141+
// debugging value:
142+
double dex_type_color_ratio() const { return m_dex_type_color_ratio; }
143+
// error reporting
144+
int dex_number_when_error() const { return m_dex_number_when_error; }
145+
146+
private:
147+
friend class BoxShinyWatcher;
148+
149+
Logger& m_logger;
150+
ImageFloatBox m_dex_number_box;
151+
ImageFloatBox m_dex_type_box;
152+
153+
uint16_t m_dex_number = 0;
154+
DexType m_dex_type = DexType::LUMIOSE;
155+
double m_dex_type_color_ratio = 0.0;
156+
int m_dex_number_when_error = 0;
157+
};
158+
159+
122160
}
123161
}
124162
}

0 commit comments

Comments
 (0)