使用OpenMp的tesseract API:有时是分段错误,有时不是

时间:2016-05-18 13:06:21

标签: c++ tesseract

我正在编写一个带有tesseract API的小型演示,通过OpenMp并行运行;它基本上是来自tesseract API使用页面的一个例子,其中添加了一些openmp风味。 可执行文件有两个参数:一个tif文件和一个整数,用于 ocrized 的页面。

我这样编译: clang-omp++ -o tessapi-quality tessapi-quality.cpp -<TESSERACT_FLAGS> -O3 -fopenmp -g

我面临的问题是它大部分时间都在工作,但是一个超过五个 - 或多或少 - 会引发一个段错误。

我尝试使用gdb进行调试,但无法找到,导致它有时会在 tesseract baseapi 函数上死掉,有时会在另一个函数上死掉。

很遗憾,我无法在我正在处理的机器上安装valgrind

我知道从没有安装tesseract的人那里测试是不方便的,但也许我在代码中遗漏了一些大的东西,你可以帮我看看

这是代码:

#include <stdlib.h>
#include <iostream>
#include <leptonica/allheaders.h>
#include <omp.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <tesseract/api/baseapi.h>

void getCompImage(const char* filename, int page){
  Pix* image;
  Pixa** pixa;
  int** blockids;
  image = pixReadTiff(filename, page);

  int num_threads = 4;
  omp_set_num_threads(num_threads);

#pragma omp parallel 
{
    tesseract::TessBaseAPI *papi = new tesseract::TessBaseAPI();
    if (papi->Init(NULL, "eng")) {
#pragma omp critical
        {
            std::cout << "Could not initialize tesseract " << '\n';
        }
        exit(1);
    }

    papi->SetImage(image);
    Boxa* boxes = papi->GetComponentImages(tesseract::RIL_TEXTLINE, true, pixa, blockids);
#pragma omp barrier

#pragma omp for schedule(static) 
    for (int i = 0; i < boxes->n; i++) {
        BOX* box = boxaGetBox(boxes, i, L_CLONE);
        papi->SetRectangle(box->x, box->y, box->w, box->h);
        char* ocrResult = papi->GetUTF8Text();
        int my_thread = omp_get_thread_num();
#pragma omp critical
        {
            std::cout << "Thread: " << my_thread << " Page: " << page << " Box[" << i << "] text: " << ocrResult << "\n";
        }
    }
    // Destroy used object and release memory
    papi->End();
}

  pixDestroy(&image);
}

int main(int argc, char *argv[])
{

    if (argc != 3){
        printf("Type the (tiff) file name to OCRize\n"
                "Then the page in the file to OCRize (first page=0, second=1 etc..)\n\n");
        exit(-1);
    }

    int page = atoi(argv[2]);

    getCompImage(argv[1], page);

    return 0;
}

0 个答案:

没有答案