mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-11-23 18:49:08 +08:00
Support symbolic values for --oem and --psm options
This fixes issue #4332. Signed-off-by: Stefan Weil <sw@weilnetz.de>
This commit is contained in:
parent
827a4e7c7f
commit
e8a9a56f9f
@ -151,44 +151,41 @@ static void PrintVersionInfo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void PrintHelpForPSM() {
|
static void PrintHelpForPSM() {
|
||||||
const char *msg =
|
printf(
|
||||||
"Page segmentation modes:\n"
|
"Page segmentation modes (PSM):\n"
|
||||||
" 0 Orientation and script detection (OSD) only.\n"
|
" 0|osd_only Orientation and script detection (OSD) only.\n"
|
||||||
" 1 Automatic page segmentation with OSD.\n"
|
" 1|auto_osd Automatic page segmentation with OSD.\n"
|
||||||
" 2 Automatic page segmentation, but no OSD, or OCR. (not "
|
" 2|auto_only Automatic page segmentation, but no OSD, or OCR. (not "
|
||||||
"implemented)\n"
|
"implemented)\n"
|
||||||
" 3 Fully automatic page segmentation, but no OSD. (Default)\n"
|
" 3|auto Fully automatic page segmentation, but no OSD. (Default)\n"
|
||||||
" 4 Assume a single column of text of variable sizes.\n"
|
" 4|single_column Assume a single column of text of variable sizes.\n"
|
||||||
" 5 Assume a single uniform block of vertically aligned text.\n"
|
" 5|single_block_vert_text Assume a single uniform block of vertically aligned text.\n"
|
||||||
" 6 Assume a single uniform block of text.\n"
|
" 6|single_block Assume a single uniform block of text.\n"
|
||||||
" 7 Treat the image as a single text line.\n"
|
" 7|single_line Treat the image as a single text line.\n"
|
||||||
" 8 Treat the image as a single word.\n"
|
" 8|single_word Treat the image as a single word.\n"
|
||||||
" 9 Treat the image as a single word in a circle.\n"
|
" 9|circle_word Treat the image as a single word in a circle.\n"
|
||||||
" 10 Treat the image as a single character.\n"
|
" 10|single_char Treat the image as a single character.\n"
|
||||||
" 11 Sparse text. Find as much text as possible in no"
|
" 11|sparse_text Sparse text. Find as much text as possible in no"
|
||||||
" particular order.\n"
|
" particular order.\n"
|
||||||
" 12 Sparse text with OSD.\n"
|
" 12|sparse_text_osd Sparse text with OSD.\n"
|
||||||
" 13 Raw line. Treat the image as a single text line,\n"
|
" 13|raw_line Raw line. Treat the image as a single text line,\n"
|
||||||
" bypassing hacks that are Tesseract-specific.\n";
|
" bypassing hacks that are Tesseract-specific.\n"
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef DISABLED_LEGACY_ENGINE
|
#ifdef DISABLED_LEGACY_ENGINE
|
||||||
const char *disabled_osd_msg = "\nNOTE: The OSD modes are currently disabled.\n";
|
printf("\nNOTE: The OSD modes are currently disabled.\n");
|
||||||
printf("%s%s", msg, disabled_osd_msg);
|
|
||||||
#else
|
|
||||||
printf("%s", msg);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DISABLED_LEGACY_ENGINE
|
#ifndef DISABLED_LEGACY_ENGINE
|
||||||
static void PrintHelpForOEM() {
|
static void PrintHelpForOEM() {
|
||||||
const char *msg =
|
printf(
|
||||||
"OCR Engine modes:\n"
|
"OCR Engine modes (OEM):\n"
|
||||||
" 0 Legacy engine only.\n"
|
" 0|tesseract_only Legacy engine only.\n"
|
||||||
" 1 Neural nets LSTM engine only.\n"
|
" 1|lstm_only Neural nets LSTM engine only.\n"
|
||||||
" 2 Legacy + LSTM engines.\n"
|
" 2|tesseract_lstm_combined Legacy + LSTM engines.\n"
|
||||||
" 3 Default, based on what is available.\n";
|
" 3|default Default, based on what is available.\n"
|
||||||
|
);
|
||||||
printf("%s", msg);
|
|
||||||
}
|
}
|
||||||
#endif // ndef DISABLED_LEGACY_ENGINE
|
#endif // ndef DISABLED_LEGACY_ENGINE
|
||||||
|
|
||||||
@ -218,9 +215,9 @@ static void PrintHelpExtra(const char *program) {
|
|||||||
" -l LANG[+LANG] Specify language(s) used for OCR.\n"
|
" -l LANG[+LANG] Specify language(s) used for OCR.\n"
|
||||||
" -c VAR=VALUE Set value for config variables.\n"
|
" -c VAR=VALUE Set value for config variables.\n"
|
||||||
" Multiple -c arguments are allowed.\n"
|
" Multiple -c arguments are allowed.\n"
|
||||||
" --psm NUM Specify page segmentation mode.\n"
|
" --psm PSM|NUM Specify page segmentation mode.\n"
|
||||||
#ifndef DISABLED_LEGACY_ENGINE
|
#ifndef DISABLED_LEGACY_ENGINE
|
||||||
" --oem NUM Specify OCR Engine mode.\n"
|
" --oem OEM|NUM Specify OCR Engine mode.\n"
|
||||||
#endif
|
#endif
|
||||||
"NOTE: These options must occur before any configfile.\n"
|
"NOTE: These options must occur before any configfile.\n"
|
||||||
"\n",
|
"\n",
|
||||||
@ -332,12 +329,64 @@ static void FixPageSegMode(tesseract::TessBaseAPI &api, tesseract::PageSegMode p
|
|||||||
|
|
||||||
static bool checkArgValues(int arg, const char *mode, int count) {
|
static bool checkArgValues(int arg, const char *mode, int count) {
|
||||||
if (arg >= count || arg < 0) {
|
if (arg >= count || arg < 0) {
|
||||||
printf("Invalid %s value, please enter a number between 0-%d\n", mode, count - 1);
|
printf("Invalid %s value, please enter a symbolic %s value or a number between 0-%d\n", mode, mode, count - 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert a symbolic or numeric string to an OEM value.
|
||||||
|
static int stringToOEM(const std::string arg) {
|
||||||
|
std::map<std::string, int> oem_map = {
|
||||||
|
{"0", 0},
|
||||||
|
{"1", 1},
|
||||||
|
{"2", 2},
|
||||||
|
{"3", 3},
|
||||||
|
{"tesseract_only", 0},
|
||||||
|
{"lstm_only", 1},
|
||||||
|
{"tesseract_lstm_combined", 2},
|
||||||
|
{"default", 3},
|
||||||
|
};
|
||||||
|
auto it = oem_map.find(arg);
|
||||||
|
printf("it: %d, %d\n", it == oem_map.end(), it->second);
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stringToPSM(const std::string arg) {
|
||||||
|
std::map<std::string, int> psm_map = {
|
||||||
|
{"0", 0},
|
||||||
|
{"1", 1},
|
||||||
|
{"2", 2},
|
||||||
|
{"3", 3},
|
||||||
|
{"4", 4},
|
||||||
|
{"5", 5},
|
||||||
|
{"6", 6},
|
||||||
|
{"7", 7},
|
||||||
|
{"8", 8},
|
||||||
|
{"9", 9},
|
||||||
|
{"10", 10},
|
||||||
|
{"11", 11},
|
||||||
|
{"12", 12},
|
||||||
|
{"13", 13},
|
||||||
|
{"osd_only", 0},
|
||||||
|
{"auto_osd", 1},
|
||||||
|
{"auto_only", 2},
|
||||||
|
{"auto", 3},
|
||||||
|
{"single_column", 4},
|
||||||
|
{"single_block_vert_text", 5},
|
||||||
|
{"single_block", 6},
|
||||||
|
{"single_line", 7},
|
||||||
|
{"single_word", 8},
|
||||||
|
{"circle_word", 9},
|
||||||
|
{"single_char", 10},
|
||||||
|
{"sparse_text", 11},
|
||||||
|
{"sparse_text_osd", 12},
|
||||||
|
{"raw_line", 13},
|
||||||
|
};
|
||||||
|
auto it = psm_map.find(arg);
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: arg_i is used here to avoid ugly *i so many times in this function
|
// NOTE: arg_i is used here to avoid ugly *i so many times in this function
|
||||||
static bool ParseArgs(int argc, char **argv, const char **lang, const char **image,
|
static bool ParseArgs(int argc, char **argv, const char **lang, const char **image,
|
||||||
const char **outputbase, const char **datapath, l_int32 *dpi,
|
const char **outputbase, const char **datapath, l_int32 *dpi,
|
||||||
@ -410,14 +459,15 @@ static bool ParseArgs(int argc, char **argv, const char **lang, const char **ima
|
|||||||
noocr = true;
|
noocr = true;
|
||||||
*list_langs = true;
|
*list_langs = true;
|
||||||
} else if (strcmp(argv[i], "--psm") == 0 && i + 1 < argc) {
|
} else if (strcmp(argv[i], "--psm") == 0 && i + 1 < argc) {
|
||||||
if (!checkArgValues(atoi(argv[i + 1]), "PSM", tesseract::PSM_COUNT)) {
|
int psm = stringToPSM(argv[i + 1]);
|
||||||
|
if (!checkArgValues(psm, "PSM", tesseract::PSM_COUNT)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*pagesegmode = static_cast<tesseract::PageSegMode>(atoi(argv[i + 1]));
|
*pagesegmode = static_cast<tesseract::PageSegMode>(psm);
|
||||||
++i;
|
++i;
|
||||||
} else if (strcmp(argv[i], "--oem") == 0 && i + 1 < argc) {
|
} else if (strcmp(argv[i], "--oem") == 0 && i + 1 < argc) {
|
||||||
#ifndef DISABLED_LEGACY_ENGINE
|
#ifndef DISABLED_LEGACY_ENGINE
|
||||||
int oem = atoi(argv[i + 1]);
|
int oem = stringToOEM(argv[i + 1]);
|
||||||
if (!checkArgValues(oem, "OEM", tesseract::OEM_COUNT)) {
|
if (!checkArgValues(oem, "OEM", tesseract::OEM_COUNT)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user