4

我写了这段代码:


tesseract::ResultIterator* ri=api.GetIterator();
Pix* pixa=(*ri).GetBinaryImage(tesseract::RIL_SYMBOL);
l_uint32 width=pixGetWidth(pixa);
l_uint32 wpl=pixGetWpl(pixa);
l_uint32 h=pixGetHeight(pixa);
int i=0;
for(i=0;i<h;i++){
l_uint32* imageData=pixGetData(pixa)+i*width;
for(int j=0;j<width;j++) {
int a=128,b=128,c=128;
SET_DATA_BYTE(imageData+j, COLOR_BLUE,a);
SET_DATA_BYTE(imageData+j, COLOR_GREEN,b);
SET_DATA_BYTE(imageData+j, COLOR_RED,c);

}
}

pixDestroy(&pixa);

它生成以下输出:

    *** glibc detected *** ./deneme2346: free(): invalid next size (normal): 0x092c6fb0 ***
    ======= Backtrace: =========
    /lib/i386-linux-gnu/libc.so.6(+0x6b961)[0xfad961]
    /lib/i386-linux-gnu/libc.so.6(+0x6d28b)[0xfaf28b]
    /lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xfb241d]
    /usr/local/lib/liblept.so.0(pixDestroy+0x6d)[0x67a1bbd]
    ./deneme2346[0x80497ac]
    ./deneme2346[0x80498a1]
    /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xf58e37]
    ./deneme2346[0x80490b1]

======= Memory map: ========
00110000-00151000 r-xp 00000000 08:06 2002695    /usr/lib/libhighgui.so.2.1.0
00151000-00152000 r--p 00040000 08:06 2002695    /usr/lib/libhighgui.so.2.1.0
....
some memory dump
Aborted

我在哪里错了,这段代码只是对我的 tesseract 使用的测试,我想让 Pix 像素值将它们转换为其他一些图像格式,例如 OpenCV。

感谢您的任何想法。

4

2 回答 2

0

为什么不在 OpenCV 中启动图像,然后在图像上运行 tesseract:

tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng");
tess.SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
Mat letter = imread("/path/to/image");

tess.SetImage((uchar*)letter.data, letter.size().width, 
              letter.size().height, letter.channels(), letter.step1());

tess.Recognize(0);

char* output = tess.GetUTF8Text();
于 2013-02-05T18:12:47.037 回答
0

这主要是作为参考,访问PIX数据的值可以使用

/**
 * Get Pixel value at given  point
 */
l_uint32 pixAtGet(PIX* pix, int_t x, int_t y)
{
    l_int32 wpl    = pixGetWpl(pix);
    l_uint32* data = pixGetData(pix);
    l_uint32* line = data + y * wpl;
    l_uint32 value = GET_DATA_BYTE(line, x);
    return value;
}

并设置像素值

/**
 * Set Pixel value at given  point
 */
void pixAtSet(PIX* pix, int_t x, int_t y, byte_t value)
{
    l_int32 wpl     = pixGetWpl(pix);
    l_uint32* data  = pixGetData(pix);
    l_uint32* line  = data + y * wpl;
    SET_DATA_BYTE(line, x, value);
}
于 2015-03-11T16:26:56.293 回答