【问题标题】:Python Tesseract Segmentation Fault 11Python Tesseract 分段错误 11
【发布时间】:2013-03-25 01:38:45
【问题描述】:

我正在使用 tesseract 和 opencv 作为不同程序的一部分来读取图像。我写这篇文章是为了解决我在主程序中遇到的错误。 test() 函数将被复制并粘贴到最终程序中。我遇到的问题是 tesseract 似乎以 Segmentation Fault 11 退出了 python。这种情况间歇性地发生。有时这个示例代码完全运行,有时它在 56 次迭代后失败(每次)。 我安装的所有东西都在自制软件中(我按照这些说明操作:https://code.google.com/p/python-tesseract/wiki/HowToCompilePythonTesseractForHomebrewMacMountainLion) 在为我的问题寻找解决方案后,我尝试了以下说明:http://www.janeriksolem.net/2011/12/installing-opencv-python-interface-on.html,我很确定我做的一切都是正确的,但我仍然偶尔会遇到 seg 错误。

import time
import tesseract
import cv2
import cv2.cv as cv
import Image
def test():
    image0=cv2.imread("test.jpg")
    offset=20
    height,width,channel = image0.shape
    image1=cv2.copyMakeBorder(image0,offset,offset,offset,offset,cv2.BORDER_CONSTANT,value=(255,255,255)) 

    api = tesseract.TessBaseAPI()
    api.Init(".","eng",tesseract.OEM_DEFAULT)
    api.SetPageSegMode(tesseract.PSM_AUTO)
    height1,width1,channel1=image1.shape
    print image1.shape
    print image1.dtype.itemsize
    width_step = width*image1.dtype.itemsize
    print width_step
    #method 1 
    iplimage = cv.CreateImageHeader((width1,height1), cv.IPL_DEPTH_8U, channel1)
    cv.SetData(iplimage, image1.tostring(),image1.dtype.itemsize * channel1 * (width1))
    tesseract.SetCvImage(iplimage,api)

    text=api.GetUTF8Text()
    conf=api.MeanTextConf()
    image=None
    print "..............."
    return (text, conf)

for x in xrange(200):
    print "x: %d" %x
    test()
    print
time.sleep(1)
print "Done"

【问题讨论】:

    标签: python segmentation-fault tesseract


    【解决方案1】:

    我知道这是一个很晚的答案,但我在使用 OS X Lion、python2.7、OpenCV 2.4 和 Tesseract 3.0 时遇到了同样的问题

    我在使用eclipse+pydev调试的时候发现了三个问题...

    首先是提供给 tesseract 的图像总是必须是二值图像。

    第二个问题是cv2.imread() 有时不起作用,它只是返回一个空的 ndarray。我真的不知道为什么会发生这种情况,以及它是否与在 eclipse+pydev 中运行 python 有关。

    因此,当我尝试使用空 ndarray 的 shapedtype 时,我有空字符,这在使用 cv.SetData() 时产生了一个空的 iplimage。当api.GetUTF8Text() 尝试处理这个空的iplimage 时,一切都以一种奇怪的方式崩溃了,我得到了“Segmentation Error 11”

    第三,事实证明 cv2 和 cv 处理数组的方式非常不同,并且它们的轴互换了。所以如果你做了类似...

    image = cv2.imread('something.jpg',0) # flag = 0 is for converting to grayscale
    image = cv2.threshold(image,128,255,cv2.THRESH_BINARY)
    height,width,channel = image.shape
    

    那么你需要做...

    iplimage = cv.CreateImageHeader((width,height), cv.IPL_DEPTH_8U, 1)
    cv.SetData(iplimage, image.tostring(),image.dtype.itemsize * (width)) #the number of channels is 1
    

    我看到你已经解决了第三个问题。

    奇怪的是,如果我在 scr = cv2.imread('textSample.jpg',0) 行之后有一个类似 img0 = cv.fromarray(scr) 的代码,那么一切正常。

    使用图像“textSample.jpg”(在本文底部)查看以下代码并取消注释行(除了第一行不是注释),以便您可以查看代码的图像正在努力。 scrimg0img1 最终应该是相同的:

    #!/usr/bin/env python
    
    import cv2
    import cv2.cv as cv
    import tesseract
    
    scr = cv2.imread('textSample.jpg',0)
    #img0 = cv.fromarray(scr)
    #cv.SaveImage('img0.jpg',img0)
    
    api = tesseract.TessBaseAPI()
    api.Init(".","eng",tesseract.OEM_DEFAULT)
    api.SetPageSegMode(tesseract.PSM_AUTO)
    
    image = cv.CreateImageHeader((scr.shape[1],scr.shape[0]), cv.IPL_DEPTH_8U, 1)
    cv.SetData(image, scr.tostring(), scr.dtype.itemsize*scr.shape[1])
    
    #cv.SaveImage('img1.jpg',image)
    
    tesseract.SetCvImage(image,api)
    text=api.GetUTF8Text()
    conf=api.MeanTextConf()
    
    print text
    print conf
    

    你应该得到类似...

    OE3456789
    !"#$%&'()* .-./
    
    76
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多