从 Python 调用 cpp 函数时出现分段错误
Segmentation fault while calling cpp function from Python
我正在尝试从python调用这个cpp函数:
TESS_API BOOL TESS_CALL TessBaseAPIProcessPages(TessBaseAPI* handle, const char* filename,
const char* retry_config, int timeout_millisec, TessResultRenderer* renderer)
{
if (handle->ProcessPages(filename, retry_config, timeout_millisec, renderer))
return TRUE;
else
return FALSE;
}
此函数的最后一个参数是 TessResultRenderer
。还有另一个用于创建TessResultRenderer
的 cpp 函数
TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase)
{
return new TessTextRenderer(outputbase);
}
现在,在从我的 python 调用它时,我做了以下操作:
outputbase = "stdout"
renderer = tesseract.TessTextRendererCreate(outputbase)
text_out = tesseract.TessBaseAPIProcessPages(api,
ctypes.create_string_buffer(path),
None, 0, renderer) //Segmentation fault (core dumped) error on this line
但我不断收到错误Segmentation fault
。
我的问题是我如何从 Python 调用TessBaseAPIProcessPages
?
库中的更多参考链接:
引用者 API
进程页面的实现(...)
编辑
尝试评论建议后,我做了以下操作,但出现错误:item 1 in _argtypes_ has no from_param method
PTessResultRenderer = ctypes.POINTER(TessResultRenderer)
self.tesseract.TessTextRendererCreate.restype = PTessResultRenderer
outputbase = "stdout"
self.tesseract.TessTextRendererCreate.argtypes = [outputbase] #error here
self.tesseract.TessTextRendererCreate
ReturnVal = ctypes.c_bool
self.tesseract.TessBaseAPIProcessPages.argtypes = [self.api, path, None, 0, PTessResultRenderer]
self.tesseract.TessBaseAPIProcessPages.restype = ReturnVal
self.tesseracto.TessBaseAPIProcessPages
class TessResultRenderer(ctypes.Structure):
pass
有一个从 contrib 文件夹中的 ctypes 使用 tesseract C-API 的示例。但是,它似乎有点过时了。contrib/tesseract-c_api-demo.py
您需要为几种方法设置restype
和argtypes
。另外,不要忘记在处理程序上调用 init 函数。以下示例适用于我。它将英语中名为"test.bmp"的文件的文本读取到text
变量中。
from ctypes import *
from ctypes.util import find_library
lang = b"eng"
filename = b"test.bmp"
TESSDATA_PREFIX = b"/usr/local/Cellar/tesseract/3.04.01_1/share/tessdata"
path = find_library("libtesseract.dylib")
tesseract = CDLL(path)
class TessBaseAPI(Structure):
pass
class TessResultRenderer(Structure):
pass
tesseract.TessBaseAPICreate.restype = POINTER(TessBaseAPI)
tesseract.TessBaseAPIInit3.argtypes = [POINTER(TessBaseAPI), c_char_p, c_char_p]
tesseract.TessBaseAPIInit3.restype = c_bool
tesseract.TessBaseAPIProcessPages.argtypes = [POINTER(TessBaseAPI), c_char_p, c_char_p, c_int, POINTER(TessResultRenderer)]
tesseract.TessBaseAPIProcessPages.restype = c_bool
tesseract.TessBaseAPIGetUTF8Text.argtypes = [POINTER(TessBaseAPI)]
tesseract.TessBaseAPIGetUTF8Text.restype = c_char_p
api = tesseract.TessBaseAPICreate()
rc = tesseract.TessBaseAPIInit3(api, TESSDATA_PREFIX, lang);
if (rc):
tesseract.TessBaseAPIDelete(api)
print("Could not initialize tesseract.n")
exit(3)
success = tesseract.TessBaseAPIProcessPages(api, filename, None , 0, None)
if success:
text = tesseract.TessBaseAPIGetUTF8Text(api)
print("="*78)
print(text.decode("utf-8").strip())
print("="*78)
输出如下所示:
==============================================================================
This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.
The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
==============================================================================
编辑:按照 eryksun 的建议,用不透明类型替换了c_void_p
的使用。谢谢!
当您
运行数组或取消引用空指针时,会发生分段错误。如果使用调试器,它将逐步引导您完成所有代码,并准确显示正在发生的事情。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?