任务如下:
- 从图片中读取文字并确定二维坐标
- 在文本周围绘制一个边界框。
我正在尝试一个例子 站点“tesseract”从图片中检测文本,我拍摄了通过“Paint”创建的第一张图片,实际上不是图片,而是白色背景上的黑色文本,所有内容都完美检测到俄语和英语字符。接下来,我尝试从网上的一张随机图片中识别字符:
悲伤减半,发现了一些东西。但它错过了很多。我正在尝试我最喜欢的游戏的屏幕截图:我
什么都看不到,什么都没有,不是俄语,也不是英语。尝试了不同的图像格式。我知道需要另一种算法?还是我没有正确使用 API?也许你需要结合算法
opencv
和tesseract
?示例代码使用了这个:
Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif");
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->Init(NULL, "eng");
api->SetImage(image);
api->Recognize(0);
tesseract::ResultIterator* ri = api->GetIterator();
tesseract::PageIteratorLevel level = tesseract::RIL_WORD;
if (ri != 0) {
do {
const char* word = ri->GetUTF8Text(level);
float conf = ri->Confidence(level);
int x1, y1, x2, y2;
ri->BoundingBox(level, &x1, &y1, &x2, &y2);
printf("word: '%s'; \tconf: %.2f; BoundingBox: %d,%d,%d,%d;\n",
word, conf, x1, y1, x2, y2);
delete[] word;
} while (ri->Next(level));
}
答案很简单:你需要教 tesseract 一种新字体,一切都会奏效!好吧,您还需要使用 OpenCV 和一系列其他操作来编辑图片,以从图片中删除不必要的对象。接下来,按文本颜色过滤,即 从图像中删除所有颜色,文本颜色除外。一般来说,如果您需要从干净的图像中读取文本 - 白色背景上的黑色文本,或者至少在中性背景上,一切可能都会正常工作,但如果它很复杂,就像我的情况一样 - 正方体 - 再见,它只是没用,没有对照片进行预处理。我已经对动态对象保持沉默 - 例如,来自网络摄像头或游戏或某个窗口的图像((我们正在谈论 TEXT!)