2016-01-18 28 views
1

我想使用java在图像中进行文本检测。我正在使用OpenIMAJ来使用MSER算法(作为第一阶段),但它需要大量的处理时间,并且在大多数图像中,返回异常OutOfMemoryError。java openimaj使用MSER算法进行文本检测时出现OutOfMemoryError

我试着改变参数,也改变了算法的源代码,但问题依然存在。

当我使用Matlab做MSER算法时,速度很快并且没有OutOfMemoryError。

这是我的代码:

MSERFeatureGenerator mser = new MSERFeatureGenerator(delta, maxArea, minArea, maxVariation, minDiversity, PixelsFeature.class); 
List<Component> up_regions = mser.generateMSERs(flattenImg, MSERDirection.Up); 

误差实际上当我打电话下列方法发生:

enter image description here

List<MergeTreeBuilder> mergeTrees = mser.performWatershed(Transforms.calculateIntensityNTSC(img)); 

没有问题的图像的实施例制作OutOfMemoryError的图像示例2:

enter image description here

请大家帮忙。

+0

只是猜测,但它可能是由于“高品质”的形象。你有没有试图以更小的尺寸和质量压缩它?图像的尺寸和大小是什么? – Enrichman

+0

谢谢,实际上即使在小图像中也会出现错误,例如(667x397尺寸和96 dpi)。我也在实时制作视频,所以我需要非常快速的响应时间。 –

回答

0

OpenIMAJ实现了由Nister和Stewinius定义的快速MSER算法(请参阅http://link.springer.com/chapter/10.1007%2F978-3-540-88688-4_14)。 OpenIMAJ实现非常快速地找到每个最稳定区域的主轴像素(您可以通过从代码中删除对PixelsFeature.class的引用来看到这一点)。

使用PixelsFeature得到OOM和性能不佳的原因是底层分水岭算法为每个区域创建256个灰度级的连通分量(这发生在找到最大稳定分量之前,所以将在每个级别创建一个具有重叠像素集的真正巨大的树结构)。这是不是你想做的事...

我没有任何代码来手来演示一种替代方法,但你可能想要做的是计算枢轴像素,然后向后工作得到ConnectedComponents使用类似洪水的方法。如果MSER方向是Up,那么从每个枢轴像素开始在图像中进行填充填充以找到由小于或等于枢轴像素值的所有像素值组成的连接组件(注意,枢轴像素代表它们的灰色 - 作为一个整数级别;你需要除以255以使其与输入图像兼容)。

+0

谢谢,我会尽力的。 –

相关问题