跳转至

OCR.h

Go to the source code of this file.

OCR功能查找图像中字符串的位置,并将该区域中的字符串作为边界框返回为unicode格式的数据。

SAIGE VISION将检测到的字符串作为 SaigeTextObject 结构返回。该结构包括字符串的位置, 表示为多边形形式的点数组,多边形位置的置信度分数,识别字符的概率分数以及检测到的字符串。

推理选项

OCR具有以下推理选项。

检查大小宽度,高度

这是使用 SaigeHandleConfig 结构创建句柄时可以设置的选项之一。与 SaigeInferenceOption::batchSize 相同,这是在创建句柄时影响内存设置的选项, 并且在创建句柄后无法更改。

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// ExampleSegRuntime.cpp:52

SaigeInferenceHandle handle = nullptr;
SaigeHandleConfig config;
config.inspectionSizeHeight = 2496;
config.inspectionSizeWidth = 2496;
unsigned int handleFlags = SAIGE_SET_INSPECTION_SIZE;
if (optimize) {
    handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handle, kProjectTypeSEG, trainedModelPath.c_str(),
                                    deviceIndex, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

检测区域选项

这些选项应用于OCR中字符区域的检测过程。这些选项用于过滤检测到的字符区域。

文本识别选项

这些选项应用于OCR的字符识别阶段。这些选项用于根据分数或特定字符字符串模式过滤识别的字符。

133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// ExampleOCRRuntime.cpp:135

/*options->textFormatting.length = 5;
SaigeInitTextFormatting(options->textFormatting);
for (int i = 0; i < options->textFormatting.length; ++i) {
    options->textFormatting.engUpper[i] = true;
    options->textFormatting.number[i] = true;
}

retval = SaigeSetInferenceOption(handle, options, SAIGE_SET_TEXT_FORMATTING);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}*/
/* options->oversizedImageHandling = SAIGE_RESIZE_TO_FIT;
 retval = SaigeSetInferenceOption(handle, options, SAIGE_SET_OVERSIZED_IMAGE_HANDLING);
 if (retval < 0) {
     std::cerr << "SaigeGetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
     SaigeDestroyInferenceHandle(handle);
     SaigeDestroyInferenceResult(result);
     return retval;
 }*/

推理结果

要获取检测到的字符串,首先获取字符串的数量,然后使用 SaigeTextObject 结构数组获取字符串信息。 在这里,我们使用C++的STL vector来处理vector中的内存分配/释放。

264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
// ExampleOCRRuntime.cpp:266

int numTextObject;
long long imreadTime, inferenceTime, postProcessingTime;
std::vector<SaigeTextObject> textObjects;
retval = SaigeGetInferenceResultNumOfTextObjects(result, &numTextObject);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultNumOfTextObjects() failed - "
              << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}
textObjects.resize(numTextObject);
retval = SaigeGetInferenceResultTextObjects(result, textObjects.data());
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultTextObjects() failed - " << SaigeStrError(retval)
              << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}