4

別のプログラムの一部として画像を読み取るために、tesseract と opencv を使用しています。この記事は、メイン プログラムで発生したバグを解決するために書きました。test() 関数はほとんどコピーされ、最終的なプログラムに貼り付けられます。私が抱えている問題は、tesseract がセグメンテーション違反 11 で python を終了するように見えることです。これは断続的に発生します。このサンプル コードが完全に実行される場合もあれば、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"
4

1 に答える 1

2

私はこれが非常に遅い答えであることを知っていますが、OS X Lion、python2.7、OpenCV 2.4、およびTesseract 3.0で作業しているときに同じ問題を抱えていました

eclipse+pydev を使用してデバッグ中に 3 つの問題が見つかりました...

1 つ目は、tesseract に指定するイメージは常にバイナリ イメージでなければならないということです。

2 番目の問題はcv2.imread()、時々機能せず、単に空の ndarray を返すことです。なぜこれが起こるのか、そしてEclipse + pydevでpythonを実行することに何か関係があるのか​​ どうかは本当にわかりません。

そのため、空の ndarray を使用しようとしたときにshapenulldtype文字があり、使用中に空の iplimage が生成されましたcv.SetData()。そして、api.GetUTF8Text()この空の iplimage で作業しようとすると、すべてが奇妙な方法で故障し、「セグメンテーション エラー 11」が発生しました。

第 3 に、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

3 番目の問題に取り組んでいるようです。

img0 = cv.fromarray(scr)奇妙なことに、行の直後のようなコードがある場合scr = cv2.imread('textSample.jpg',0)、すべて正常に動作します。

画像 "textSample.jpg" (この投稿の下部) を使用して次のコードを実行し、行のコメントを外して (コメントではない最初の行を除く)、コードがどの画像で動作しているかを確認できるようにします。 . scrimg0そして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

テキストサンプル.jpg

于 2013-07-22T00:22:59.990 に答える