Python Tesseract 分割错误 11

4
我正在使用 tesseract 和 opencv 作为不同程序的一部分来读取图像。我编写了这段代码来尝试解决我在主程序中遇到的错误。test() 函数将会被复制并粘贴到最终程序中。我遇到的问题是,tesseract 似乎会时不时地使 python 软件崩溃,并显示 Segmentation Fault 11。有时候这个示例代码可以完全运行,有时候则会在进行第56次迭代后失败(每次都是如此)。 我安装的所有东西都在 homebrew 中(我遵循了这些说明: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"
1个回答

2
我知道这是一个非常晚的答案,但当我使用OS X Lion、python2.7、OpenCV 2.4和Tesseract 3.0时,我遇到了相同的问题。
在使用eclipse+pydev进行调试时,我发现了三个问题...
第一个问题是给tesseract的图像必须始终是二进制图像。
第二个问题是cv2.imread()有时不起作用,它只会返回一个空的ndarray。我真的不知道为什么会发生这种情况,如果它与在eclipse+pydev中运行python有关,那就更不清楚了。
因此,当我尝试利用空ndarray的shapedtype时,我得到了空的iplimage,并在使用cv.SetData()时产生了null字符。而当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

textSample.jpg


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接