两个相似形状之间的OpenCV形状匹配

Cyon

我正在尝试将稍微不规则的形状与形状数据库匹配。例如,在这里我要匹配的轮廓:

在此处输入图片说明

有关更多信息,这是HDMI连接器的轮廓,以轮廓表示。这有点粗糙,因为这是在握住HDMI时用手机拍摄的。

这是我的连接器数据库:

HDMI: 在此处输入图片说明

DVI: 在此处输入图片说明

5PinDIN: 在此处输入图片说明

DB25: 在此处输入图片说明

这些轮廓更加清晰,因为这些轮廓是从互联网的连接器图像中收集的。

对于我尝试过的:

cv2.matchShapes()

由于这些都是轮廓,因此我尝试使用matchShapes()方法直接比较它们,但结果不佳。不规则轮廓与我的数据库之间的相似之处是:

HDMI:0.90

DB25:0.84

5 DIN针:0.5

DVI:0.21

由于匹配结果越接近0,轮廓越相似,该算法完全失败。我通过更改第三个参数尝试了其他匹配方法,但仍然没有成功。

ORB:

与SIFT类似,我尝试了关键点匹配。在数据库中平均不同匹配项之间的距离(找到匹配项的前15%之后):

mean([m.distance for m in matches])

距离为:

五针DIN:7.6

DB25:11.7

DVI:12.1

HDMI:19.6

由于这将圆形归类为最像我的轮廓的形状,因此也失败了。

以下是实际HDMI插槽与我的示例HDMI插槽的ORB匹配的关键点,以获取更多信息: 在此处输入图片说明

有什么想法/其他算法应该尝试吗?还是CNN是我唯一的选择(我宁愿避免使用它,因为我没有足够的数据量)。

成功

可以执行多个步骤以获得更好的结果。并且不需要CNN或某些复杂的功能匹配,让我们尝试使用非常基本的方法来解决此问题。

1.规范化查询图像和数据库图像。

可以通过仔细裁剪输入轮廓,然后将所有图像调整为相同的高度或宽度来实现。我将在这里选择宽度,比方说300px。让我们为此定义一个实用程序方法:

def normalize_contour(img):
    im, cnt, _ = cv2.findContours(img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    bounding_rect = cv2.boundingRect(cnt[0])
    img_cropped_bounding_rect = img[bounding_rect[1]:bounding_rect[1] + bounding_rect[3],
                                bounding_rect[0]:bounding_rect[0] + bounding_rect[2]]

    new_height = int((1.0 * img.shape[0])/img.shape[1] * 300.0)
    img_resized = cv2.resize(img_cropped_bounding_rect, (300, new_height))
    return img_resized

此代码段将返回固定宽度为300的裁剪好的轮廓。将此方法应用于所有数据库图像以及输入的查询图像。

2.仅使用输入归一化图像的高度进行过滤。

由于我们已将输入图像标准化为300像素,因此我们可以拒绝所有高度不接近标准化图像高度的候选图像。这将排除5PinDIN。

3.比较面积

现在,您可以尝试对具有最大重叠量的结果进行排序,可以cv2.contourArea()获取轮廓区域,并对所有剩余的候选对象进行排序,以获取最接近的匹配项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个形状的交点之间的画线

计算两个相同形状矩阵的行之间的余弦相似度的最快方法是什么

二叉树问题。检查相似形状

找出两个形状相同的 DataFrame 之间的差异

在两个KonvaJS画布之间拖动形状

CSS:两个div之间复杂的形状划分

在两个文本块之间居中的图像的形状外部

如何突出显示两个形状之间的重叠区域

匹配两个列表之间的相似元素

在具有相同形状的两个列表中查找相似的实例

检测 OpenCV 形状的最简单/最稳健的两个对象联合相交

恢复中的InvalidArgumentError:Assign需要两个张量的形状匹配

Tensorflow Assign需要两个张量的形状匹配。lhs shape = [20] rhs shape = [48]

Tensorflow 分类到回归“分配需要两个张量的形状匹配”

在两个贝塞尔曲线路径形状之间进行动画处理

在两个节点之间创建链接时如何更改节点高亮形状(gojs)

如何计算两个不同形状的numpy数组之间的距离以执行KNN实现

随颜色变化突出显示两个图像之间的形状差异

如何找到两个简单形状之间的单应性?

openCV中的轮廓匹配形状

将两个 (momentJs) 日期数组之间的相似 (momentJs) 日期匹配到一个新数组中

numpy的,合并两个不同形状的数组

为什么两个 SVG 形状的减法仍然相交?

确保两个随机形状不会彼此靠近或重叠

如何在SVG中合并两个形状?

如何连接不同形状的两个张量

如何区分两个相邻的连接形状

仅绘制两个形状之一

如何解决错误“ tensorflow.python.framework.errors_impl.InvalidArgumentError:分配需要两个张量的形状都匹配。”