由于光照不一致、方向变化、比例变化等原因,模板匹配对于此类应用程序往往不可靠。解决此问题的典型方法是引入机器学习。通过训练自己的增强分类器来尝试做的是一种可能的方法。但是,我认为您没有正确地进行培训。你提到你给了它 1 个标志作为正面训练图像和 5 个其他不包含标志的图像作为负面例子?通常,您需要训练样本数量为数百或数千或更多。您不可能使用 6 个训练样本进行训练并期望它能够工作。
如果您不熟悉机器学习,大致应该这样做:
1) 您需要收集您要检测的对象的 许多 个正训练样本(从数百个开始,但通常越多越好)。如果您尝试检测图像中的单个字符,则获取单个字符的裁剪图像。为此,您可以从 MNIST 数据库开始。更好的是,为了针对您的特定问题训练分类器,从照片中获取许多公共汽车上人物的裁剪图像。如果您尝试检测整个矩形 LED 板面板,则使用它们的图像作为您的正训练样本。
2) 您将需要收集 许多 个负训练样本。它们的数量应该与您拥有的正训练样本的数量相同。这些可能是您将运行检测器的图像中出现的其他对象的图像。例如,您可以裁剪公共汽车前部、路面、沿路树木等的图像,并将它们用作反面示例。这是为了帮助分类器在您运行检测器的图像中排除这些对象。因此,负面示例不仅仅是包含您不想检测的对象的任何图像。它们应该是可能被误认为是您在运行检测器的图像中尝试检测的对象的对象(至少对于您的情况而言)。
关于如何训练级联分类器并生成 XML 模型文件,请参见以下链接:http://note.sonots.com/SciSoftware/haartraining.html
尽管您提到您只想检测单个字符而不是总线上的整个 LED 面板,但我还是建议您首先检测 LED 面板,以便定位包含感兴趣字符的区域。之后,要么在这个较小的区域内执行模板匹配,要么运行一个经过训练的分类器,以识别该区域中使用滑动窗口方法获得的像素块上的单个字符,并且可能在多个尺度上。 (注意:您上面提到的 haarcascade 增强分类器将检测字符,但它不会告诉您它检测到的字符,除非您只训练它来检测该特定字符......)以滑动窗口方式检测该区域中的字符将给出您可以按照字符出现的顺序将它们串成单词等。
希望这会有所帮助。
编辑:
我在单独发现@KaolinFire 提到的OpenCV 3 中的场景文本模块后偶然发现了我的这篇旧帖子。
对于那些好奇的人,这是在 OP 提供的示例图像上运行该检测器的结果。请注意,检测器能够定位文本区域,即使它返回多个边界框。
请注意,此方法并非万无一失(至少在 OpenCV 中此实现具有默认参数)。它往往会产生误报,尤其是当输入图像包含许多“干扰因素”时。
以下是在 Google Street View 数据集上使用此 OpenCV 3 文本检测器获得的更多示例:
请注意,它倾向于在平行线(例如窗户、墙壁等)之间找到“文本”。由于 OP 的输入图像可能包含户外场景,这将是一个问题,尤其是如果他/她不将感兴趣的区域限制在 LED 标志周围的较小区域。
看来,如果您能够定位一个仅包含文本的“粗糙”区域(例如,仅 OP 示例图像中的 LED 标志),那么运行此算法可以帮助您获得更紧密的边界框。但是您将不得不处理误报(可能丢弃小区域或使用基于 LED 标志上字母显示方式的启发式算法在重叠的边界框中进行挑选)。
这里有更多关于文本检测的资源(讨论 + 代码 + 数据集)。
代码
数据集
您将在此处找到 google streetview 和 MSRA 数据集。尽管这些数据集中的图像与公交车上 LED 标志的图像并不完全相同,但它们可能有助于从几个竞争算法中挑选“最佳”性能的算法,或者从头开始训练机器学习算法。
http://www.iapr-tc11.org/mediawiki/index.php/Datasets_List