Skip to content

Commit 41ce339

Browse files
committed
Change date reader to use read_number_waterfill(). Make it work for all 6 color themes.
1 parent 49f4d3a commit 41ce339

File tree

4 files changed

+43
-27
lines changed

4 files changed

+43
-27
lines changed

SerialPrograms/Source/CommonFramework/OCR/OCR_NumberReader.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,20 @@ int read_number(Logger& logger, const ImageViewRGB32& image, Language language){
102102

103103
int read_number_waterfill(
104104
Logger& logger, const ImageViewRGB32& image,
105-
uint32_t rgb32_min, uint32_t rgb32_max
105+
uint32_t rgb32_min, uint32_t rgb32_max,
106+
bool text_inside_range
106107
){
107108
using namespace Kernels::Waterfill;
108109

109110
// Direct OCR is unreliable. Instead, we will waterfill each character
110111
// to isolate them, then OCR them individually.
111112

112-
ImageRGB32 filtered = to_blackwhite_rgb32_range(image, rgb32_min, rgb32_max, true);
113-
PackedBinaryMatrix matrix = compress_rgb32_to_binary_range(image, rgb32_min, rgb32_max);
113+
ImageRGB32 filtered = to_blackwhite_rgb32_range(image, rgb32_min, rgb32_max, text_inside_range);
114+
115+
// static int c = 0;
116+
// filtered.save("test-" + std::to_string(c++) + ".png");
117+
118+
PackedBinaryMatrix matrix = compress_rgb32_to_binary_range(filtered, 0xff000000, 0xff7f7f7f);
114119

115120
std::map<size_t, WaterfillObject> map;
116121
{

SerialPrograms/Source/CommonFramework/OCR/OCR_NumberReader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ int read_number(Logger& logger, const ImageViewRGB32& image, Language language =
2828
// end. This requires specifying the color range for the text.
2929
int read_number_waterfill(
3030
Logger& logger, const ImageViewRGB32& image,
31-
uint32_t rgb32_min, uint32_t rgb32_max
31+
uint32_t rgb32_min, uint32_t rgb32_max,
32+
bool text_inside_range = true
3233
);
3334

3435

SerialPrograms/Source/NintendoSwitch/Inference/NintendoSwitch_DateReader.cpp

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ using std::endl;
3333
namespace PokemonAutomation{
3434
namespace NintendoSwitch{
3535

36-
3736
DateReader::DateReader()
3837
: m_background_top(0.50, 0.02, 0.45, 0.08)
3938
, m_window_top(0.50, 0.36, 0.45, 0.07)
@@ -92,7 +91,10 @@ bool DateReader::detect(const ImageViewRGB32& screen) const{
9291
// cout << "zxcv" << endl;
9392
return false;
9493
}
95-
if (stats_background_top.average.sum() > stats_window_top.average.sum()){
94+
// cout << "stats_background_top: " << stats_background_top.average.sum() << endl;
95+
// cout << "stats_window_top: " << stats_window_top.average.sum() << endl;
96+
if (std::abs(stats_background_top.average.sum() - stats_window_top.average.sum()) < 50){
97+
// cout << "xcvb" << endl;
9698
return false;
9799
}
98100

@@ -104,6 +106,7 @@ bool DateReader::detect(const ImageViewRGB32& screen) const{
104106

105107
double stddev = stats_us_hours.stddev.sum();
106108
if (stddev < 80){
109+
// cout << "sdfg" << endl;
107110
return false;
108111
}
109112

@@ -128,8 +131,7 @@ int8_t DateReader::read_hours(Logger& logger, const ImageViewRGB32& screen) cons
128131
double stddev = stats_us_hours.stddev.sum();
129132
bool format_us = stddev > 30;
130133
if (format_us){
131-
ImageRGB32 us_hours_filtered = to_blackwhite_rgb32_range(us_hours, 0xff000000, 0xff7f7f7f, white_theme);
132-
int hours = OCR::read_number(logger, us_hours_filtered);
134+
int hours = read_box(logger, 1, 12, screen, m_us_hour, white_theme);
133135
if (hours < 1 || hours > 12){
134136
return -1;
135137
}
@@ -138,7 +140,7 @@ int8_t DateReader::read_hours(Logger& logger, const ImageViewRGB32& screen) cons
138140
}
139141

140142
ImageViewRGB32 us_ampm = extract_box_reference(screen, m_us_ampm);
141-
ImageRGB32 us_ampm_filtered = to_blackwhite_rgb32_range(us_ampm, 0xff000000, 0xff7f7f7f, white_theme);
143+
ImageRGB32 us_ampm_filtered = filter_image(us_ampm, white_theme);
142144

143145
std::string ampm = to_utf8(OCR::normalize_utf32(OCR::ocr_read(Language::English, us_ampm_filtered)));
144146
if (ampm == "am"){
@@ -150,9 +152,7 @@ int8_t DateReader::read_hours(Logger& logger, const ImageViewRGB32& screen) cons
150152
}
151153
return (int8_t)hours;
152154
}else{
153-
ImageViewRGB32 h24_hours = extract_box_reference(screen, m_24_hour);
154-
ImageRGB32 h24_hours_filtered = to_blackwhite_rgb32_range(h24_hours, 0xff000000, 0xff7f7f7f, white_theme);
155-
int hours = OCR::read_number(logger, h24_hours_filtered);
155+
int hours = read_box(logger, 0, 23, screen, m_24_hour, white_theme);
156156
if (hours < 0 || hours > 23){
157157
return -1;
158158
}
@@ -290,20 +290,35 @@ std::pair<DateFormat, DateTime> DateReader::read_date(Logger& logger, std::share
290290

291291
return {DateFormat::EU, read_date_eu(logger, std::move(screen), white_theme)};
292292
}
293+
ImageRGB32 DateReader::filter_image(const ImageViewRGB32& image, bool white_theme){
294+
ImageRGB32 filtered = to_blackwhite_rgb32_range(
295+
image,
296+
0xff000000, white_theme ? 0xffff7fff : 0xff7f7f7f,
297+
white_theme
298+
);
299+
return filtered;
300+
}
293301
int DateReader::read_box(
294302
Logger& logger,
295303
int min, int max,
296304
const ImageViewRGB32& screen, const ImageFloatBox& box,
297305
bool white_theme
298306
) const{
299-
ImageRGB32 filtered = to_blackwhite_rgb32_range(
300-
extract_box_reference(screen, box),
301-
0xff000000, 0xff7f7fff,
302-
white_theme
303-
);
304-
// extract_box_reference(*screen, m_us_month).save("test0.png");
305-
// filtered.save("test1.png");
306-
int value = OCR::read_number(logger, filtered);
307+
ImageViewRGB32 cropped = extract_box_reference(screen, box);
308+
309+
int value;
310+
if (white_theme){
311+
value = OCR::read_number_waterfill(
312+
logger, cropped,
313+
0xff000000, 0xffff7fff, true
314+
);
315+
}else{
316+
value = OCR::read_number_waterfill(
317+
logger, cropped,
318+
0xff000000, 0xff7f7f7f, false
319+
);
320+
}
321+
307322
if (value < min || value > max){
308323
value = -1;
309324
}
@@ -322,18 +337,12 @@ DateTime DateReader::read_date_us(Logger& logger, std::shared_ptr<const ImageRGB
322337
// Hour
323338
{
324339
int hour = read_box(logger, 1, 12, *screen, m_us_hour, white_theme);
325-
ImageRGB32 hours_filtered = to_blackwhite_rgb32_range(
326-
extract_box_reference(*screen, m_us_hour),
327-
0xff000000, 0xff7f7fff,
328-
white_theme
329-
);
330340
if (hour == 12){
331341
hour = 0;
332342
}
333343

334-
ImageRGB32 us_ampm_filtered = to_blackwhite_rgb32_range(
344+
ImageRGB32 us_ampm_filtered = filter_image(
335345
extract_box_reference(*screen, m_us_ampm),
336-
0xff000000, 0xff7f7fff,
337346
white_theme
338347
);
339348

SerialPrograms/Source/NintendoSwitch/Inference/NintendoSwitch_DateReader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class DateReader : public StaticScreenDetector{
5454
) const;
5555

5656
private:
57+
static ImageRGB32 filter_image(const ImageViewRGB32& image, bool white_theme);
5758
int read_box(
5859
Logger& logger,
5960
int min, int max,

0 commit comments

Comments
 (0)