我正在对几个数字的图片进行OCR。我隔离这些数字,计算每个数字的七个不变矩,并存储数据。当每个数字都有足够的数据时,我想要将一个输入的数字与我已经拥有的数据相匹配。
我首先计算数字的七个hu矩,然后检查所有数据并检查是否有其他hu矩向量与我的新到达的数字匹配。
对于数字6,七个hu力矩可能看起来像这样:
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来计算力矩。
EDIT:另一个问题:现在我刚刚用每个数字周围的边界框隔离了每个数字,并计算了该图像的hu矩。计算手指周围轮廓的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);
我有时会以0作为hu力矩结束。contours.get(0)是传递给力矩计算的正确参数吗?
EDIT2:抱歉编辑,但从我现在对自己进行的尝试来看,我计算的hu不变矩太相似了。我不能巧妙地把它们区分开来。可能我现在计算它们的方法太"粗糙"了。我实际上只是在每个数字图像中找到最大的轮廓,即每个数字的边界框图像,并从中计算hu矩。
首先你必须使用或构建一个大型数据库,这个网站有很多数据:机器学习数据集收集
其次,最好的方法是使用神经网络分类器或决策树的增强,在我的情况下,我使用C4.5算法与这个数据库手写数字识别数据集,它给了我99%的识别率,这是相当多的。我想所有这些算法都已经在boost库中实现了。Java试试weka