我使用tesseract和opencv来读取图像作为不同程序的一部分。我写了这篇文章试图解决我对主程序的错误。 test()函数将被复制并粘贴到最终程序中。我遇到的问题是tesseract似乎退出python with Segmentation Fault 11.这种情况间歇性地发生。有时这个示例代码完全运行,有时它会在56次迭代(每次)后失败。 我安装的所有东西都是自制的(我按照这些说明操作:https://code.google.com/p/python-tesseract/wiki/HowToCompilePythonTesseractForHomebrewMacMountainLion) 在搜索了我的问题的解决方案之后,我尝试了这个中的说明:http://www.janeriksolem.net/2011/12/installing-opencv-python-interface-on.html,我很确定我做的一切都是正确的,但我仍然偶尔遇到段错误。
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"
答案 0 :(得分:2)
我知道这是一个非常晚的答案,但我在使用OS X Lion,python2.7,OpenCV 2.4和Tesseract 3.0时遇到了同样的问题
我在使用eclipse + pydev进行调试时发现了三个问题...
首先,赋予tesseract的图像必须始终是二进制图像。
第二个问题是cv2.imread()
有时不起作用,它只返回一个空的ndarray。我真的不知道为什么会这样,如果它与在eclipse + pydev中运行python有关。
因此,当我尝试使用空的ndarray shape
和dtype
时,我使用了空字符,这在使用cv.SetData()
时产生了空iplimage。当api.GetUTF8Text()
试图在这个空的iplimage上工作时,一切都以一种奇怪的方式崩溃,我得到了“分段错误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
我看到你已经解决了第三个问题。
奇怪的是,如果我在img0 = cv.fromarray(scr)
行后面有scr = cv2.imread('textSample.jpg',0)
之类的代码,那么一切正常。
使用图片“textSample.jpg”(在本文的底部)查看以下代码,并取消注释行(第一行不是注释),以便您可以看到代码的图像正在努力。 scr
,img0
和img1
最终应该相同:
#!/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