我正在制作一个大型文本识别程序。我正在尝试在多线程模式下使用Tesseract(最多50个线程)。有时,当我调试我的程序时,我会在以下行上遇到错误(分段故障):
/// Returns true if the edge spot in this location is occupied.
inline bool edge_occupied(EDGE_REF edge_ref) const
{
return (edges_[edge_ref] != next_node_mask_);
}
在文件中。。。\tesseract ocr\dict\dawg.h
我正在每个线程中创建tesseract的每个实例,如下所示:
tesseract::TessBaseAPI *text_ocr = new tesseract::TessBaseAPI();
if (text_ocr->Init(NULL,"eng",tesseract::OEM_DEFAULT))
{
qDebug() << "fail to init tessract in the thread" << _id;
return;
}
我正在使用Tesseract 3 dll
尝试检查变量"edges_"、"edge_ref"、"next_node_mask",它可能会在其他线程中同时被修改,修改会导致segfault。如果出现分段错误,您可以看到其他线程的调用堆栈,以及该变量在其他线程中的使用情况。
在我开始将新的qt 5.2.0与msvc2012一起使用后,我设法消除了这个错误,因此我为win32使用了预构建的tesseract 3.02(msvc)二进制文件。实际上,若您创建了太多相同的tesseract实例,应用程序就会崩溃。