跳转至

OCR.h

Go to the source code of this file.

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

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

推理选项

OCR具有以下推理选项。

检查大小宽度,高度

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

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// ExampleSegRuntime.cpp:64

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

retval = SaigeCreateInferenceHandle(&handle2, kProjectTypeSEG, trainedModelPath.c_str(),
                                    0, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

retval = SaigeCreateInferenceHandle(&handle3, kProjectTypeSEG, trainedModelPath.c_str(), 1,
                                    &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

检测区域选项

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

文本识别选项

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

143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
// ExampleOCRRuntime.cpp:145

/*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中的内存分配/释放。

274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
// ExampleOCRRuntime.cpp:276

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;
}