这组图像的简短答案是使用 OpenCV matchShapes 方法 I2 并使用较小的“eps”重新编码方法 matchShapes。 double eps = 1.e-20; 足够小了。
我是一名高中机器人团队的导师,我认为 OpenCV matchShapes 正是我们改善机器人视觉所需的(缩放、平移和旋转不变,并且学生易于在现有的 OpenCV 代码中使用)。我在研究几个小时后发现了这篇文章,这太可怕了!鉴于这些结果,matchShapes 怎么可能对我们有用?我对这些糟糕的结果感到怀疑。
我编写了自己的 matchShapes(在 Java 中 - 这是学生们想要使用的),以查看更改 eps 的效果(显然保护 log10 函数不为零并通过调用它们来防止大差异的小值完美匹配 - 与实际情况相反;我找不到价值的基础)。我将 matchShapes eps 从 OpenCV 编号 1.e-5 更改为 1.e-20 并获得了不错的结果,但过程仍然令人不安。
如果给出了正确的答案,我们可以扭曲一个过程来得到它,这很棒但也很可怕。附图包含了胡矩比较的所有3种方法,方法2和3都做得很好。
我的过程是保存上面的图像,转换为二进制 1 通道,扩张 1,腐蚀 1,findCountours,matchShapes 与 eps = 1.e-20。
Method 2,Target HDMI with itself = 0., HDMI=1.15, DVI=11.48, DB25=27.37, DIN=74.82
Method 3,Target HDMI with itself = 0. ,HDMI=0.34, DVI= 0.48, DB25= 2.33, DIN= 3.29
contours and Hu Moment comparisons - matchShapes 3 methods
我继续我的幼稚研究(很少有统计学背景),并找到了各种其他方法来进行标准化和比较。我无法弄清楚 Pearson 相关系数和其他协方差方法的细节,也许它们不合适。我又测试了两种归一化方法和另一种匹配方法。
OpenCV 使用 Log10 函数对其所有三个匹配计算进行归一化。
我尝试使用与每对最大值 max(Ai,Bi) 的比率对每对 Hu 矩进行归一化,并尝试将每对归一化为向量长度 1(除以平方和的 sqrt)。
在使用余弦 theta 方法计算 7 维 Hu 矩向量之间的角度之前,以及在计算类似于 OpenCV 方法 I2 的元素对差异之和之前,我使用了这两个新的归一化。
我的四个新混合物效果很好,但除了值的范围更小并且仍然排序相同之外,除了具有“校正”eps 的 openCV I2 之外没有任何贡献。
请注意,I3 方法不是对称的 - 交换 matchShapes 参数顺序会更改结果。对于这组图像,将“未知”的时刻作为第一个参数,并与已知形状列表作为第二个参数进行比较以获得最佳结果。反过来将结果更改为“错误”的答案!
我尝试的匹配方法中的数字 7 仅与 Hu Moments 的数量 - 7 巧合。
7 种不同计算的匹配索引说明
|Id|normalization |matching index computation |best value|
|--|-------------------------|---------------------------------|----------|
|I1|OpenCV log |sum element pair reciprocals diff|0|
|I2|OpenCV log |sum element pair diff |0|
|I3|OpenCV log |maximum fraction to A diff |0|
|T4|ratio to element pair max|vectors cosine angle |1|
|T5|unit vector |vectors cosine angle |1|
|T6|ratio to element pair max|sum element pair diff |0|
|T7|unit vector |sum element pair diff |0|
对 5 幅图像中的每幅图像进行 7 次不同计算的匹配索引结果
| | I1 | I2 | I3 | T4 | T5 | T6 | T7 |
|---------------|-----|-----|-----|-----|-----|-----|-----|
|HDMI 0 | 1.13| 1.15| 0.34| 0.93| 0.92| 2.02| 1.72|
|DB25 1 | 1.37|27.37| 2.33| 0.36| 0.32| 5.79| 5.69|
|DVI 2 | 0.36|11.48| 0.48| 0.53| 0.43| 5.06| 5.02|
|DIN5 3 | 1.94|74.82| 3.29| 0.38| 0.34| 6.39| 6.34|
|unknown(HDMI) 4| 0.00| 0.00| 0.00| 1.00| 1.00| 0.00| 0.00|(this image matches itself)
[创建 OpenCV 问题 16997 来解决 matchShapes 中的这个弱点。]