我在Java中使用Opencv 3,我试图在其他图像上找到小图像(如25x25像素).但FeatureDetector检测(0,0)大小Mat在小图像上.
Mat smallImage = ...
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
Mat descriptorsSmall = new Mat();
MatOfKeyPoint keyPointsSmall = new MatOfKeyPoint();
detector.detect(smallImage, keyPointsSmall);
descriptor.compute(smallImage, keyPointsSmall, descriptorsSmall);
Run Code Online (Sandbox Code Playgroud)
在这里,我得到keyPointsSmall和descriptorsSmall大小为零,并确保检测不起作用.
但是,如果我在150x150像素的较大图像上尝试此功能,那就可以了.有什么建议?谢谢.
并且让它说我们有P字母的模板,所以我们需要在源图像上检测这个P.

好吧,将图像缩放到更高的分辨率对我来说不起作用.这将耗费时间和资源.理想情况下,它应该是旋转尺度不变的.但是没有旋转和缩放的简单解决方案也可以.
除OpenCv之外的其他解决方案对我来说是不可接受的.(例如使用Tesseract)
您似乎尝试读取 PersonalID 属性。基本上,我们所做的就是准备图像,将其矢量化(因此其比例和旋转不变)并进行比较/匹配。这可以在 OpenCV 中完成。
准备工作:通常会降低颜色和亮度。如果您的字母非常突出,您可以使用阈值(亮度/颜色/每个颜色通道)并删除这些颜色。对于你来说,你可以将所有不几乎是黑色的东西都减少成白色。您可能想尝试额外的锐化甚至边缘检测。
矢量化非常简单,并且可以进一步改进,因为您知道您只对某些符号感兴趣,您应该找到可用于改进矢量化结果的其他品质(抑制噪声、更好地选择和校正某些边缘/角度) ETC)。
匹配应该非常简单。由于您知道目标字体和潜在的符号,因此匹配应该会产生大量积极的结果,并且误差范围非常小。此外,大多数错误应该易于识别,以便您可以将可能存在的少数错误发送给某人进行验证。
潜在的改进:
使用分形方法进行缩放通常可以很好地保留字母和数字的属性,并且可以提高结果的质量。
检测ID的不同部分将帮助您识别检测的目标区域。这使您可以进一步改进结果。人们通常只关注他们想要识别的内容,而忘记了其他不需要的信息。但这些信息可以让您了解在检测中可能犯的潜在错误。因此,如果您无法正确识别名称,那么您的 ID 很可能也会失败。因此,如果图片质量足以确定您真正关心的信息,那么尝试获取 ID 的所有信息是一个很好的指标。
如果您确切知道目标区域是什么样的,则可以将目标区域缩放到固定大小并使用每像素匹配。由于您确切地知道您关心的字体,因此这种检测可以具有令人惊讶的高检测率。使用每像素匹配和矢量化将为您提供卓越的检测率。与矢量化相比,每像素匹配也非常快。
由于您知道预期符号的位置和大小,因此您可以根据属性(符号的实际大小、某些区域的黑色分布等)创建决策树。这会将问题从 35 分之一减少到 4 分之一甚至更少。
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |