我正在对几位数的图片进行OCR。我将数字隔离,计算每个数字的七个hu不变矩,然后存储数据。因此,当我为每个数字提供足够的数据时,我希望将一个输入数字与我已有的数据相匹配。
我首先计算数字的七个胡子时刻,然后我查看所有数据并检查其他一些胡子时刻向量是否与我新到的数字匹配。
对于数字 6 ,七个胡子时刻可能如下所示:
0.0015019597635929924
8.216737738246056E-7
2.0375639403591246E-10
7.83546684255912E-11
7.317864741055554E-21
3.429093590309372E-14
-6.668347984552349E-21
其他六个也很相似。
数字 1 可能包含以下数据:
0.0013343457573374317
7.801615619419164E-7
1.2084360881640018E-10
2.0011222038541843E-10
3.0737764628109555E-20
1.7596117047839112E-13
4.854579634937481E-21
因此,如果我收到一个1的hu时刻,我希望它与1数据匹配最佳。我应该如何处理这个问题,实现它的最佳方法是什么?我正在使用 Java 与 OpenCV 来计算时刻。
编辑:另外一个问题:现在我刚刚用每个数字周围的边界框隔离每个数字,并计算该图像的hu时刻。相反,计算数字周围轮廓的胡矩是否更准确?如果是这样,任何关心解释方法的人? 只需做:
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(image, contours, new Mat(),Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
Moments mom = new Moments();
mom = Imgproc.moments(contours.get(0), false);
Mat hu = new Mat();
Imgproc.HuMoments(mom, hu);
我有时最终会将零值视为胡子。 contours.get(0)是传递给时刻计算的正确参数吗?
EDIT2:很抱歉编辑,但是从我现在尝试过的,我计算的hu不变时刻太相似了。我无法以聪明的方式区分它们。可能我现在计算它们的方式太粗糙了#34;我实际上只是在每个数字图像中找到最大的数字,即每个数字的边界框图像,并从中计算胡子时刻。
答案 0 :(得分:0)
首先你必须使用或构建一个大型数据库,这个网站有很多数据:machine learning data set collection
其次,最好的方法是使用神经元网络分类器或决策树的增强,在我的情况下,我使用C4.5算法和这个数据库Pen-Based Recognition of Handwritten Digits Data Set ,它给我99%的速率是差不多。我所有这些算法都已经在boost库中实现了。 对于java,请尝试weka