比较两个轮廓的相似度

时间:2021-07-27 17:38:20
我有两个轮廓
 A: 比较两个轮廓的相似度
 B: 比较两个轮廓的相似度  

我手头其实有一堆类似于 A的轮廓的素材库,我想做的是用 B轮廓与素材库中的轮廓做比较,匹配一个最相似的轮廓。这里面B轮廓的size明显大于素材库中的轮廓。

6 个解决方案

#2


OpenCV 里有个ShapeContext 比较轮廓的,效果还可以,就是速度慢一些

#3




CSDN博客

 Augusdi

博客专家

OpenCV图像的轮廓的匹配

发表于2013/5/31 15:37:29  15733人阅读

分类: OpenCV

一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板.



比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征.通常,我们如下定义一个轮廓的(p,q)矩:



在公式中p对应x纬度上的矩,q对应y维度上的矩,q对应y维度上的矩,阶数表示对应的部分的指数.该计算是对轮廓边界上所有像素(数目为n)进行求和.如果p和q全为0,那么m00实际上对轮廓边界上点的数目.

下面的函数用于计算这些轮廓矩

void cvContoursMoments(CvSeq* contour,CvMoments* moments)

第一个参数是我们要处理的轮廓,第二个参数是指向一个结构,该结构用于保存生成的结果.CvMonments结构定义如下

/* Spatial and central moments */ typedef struct CvMoments { double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; /* spatial moments */ double mu20, mu11, mu02, mu30, mu21, mu12, mu03; /* central moments */ double inv_sqrt_m00; /* m00 != 0 ? 1/sqrt(m00) : 0 */ } CvMoments;

#4


@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口

#5


引用 4 楼 flxshujie 的回复:
@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口


OpenCV3.1.0里有的,参考samples文件里的shape_example.cpp

#6


引用 5 楼 ssbqrm 的回复:
Quote: 引用 4 楼 flxshujie 的回复:

@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口


OpenCV3.1.0里有的,参考samples文件里的shape_example.cpp

比较两个轮廓的相似度

#1


#2


OpenCV 里有个ShapeContext 比较轮廓的,效果还可以,就是速度慢一些

#3




CSDN博客

 Augusdi

博客专家

OpenCV图像的轮廓的匹配

发表于2013/5/31 15:37:29  15733人阅读

分类: OpenCV

一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板.



比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征.通常,我们如下定义一个轮廓的(p,q)矩:



在公式中p对应x纬度上的矩,q对应y维度上的矩,q对应y维度上的矩,阶数表示对应的部分的指数.该计算是对轮廓边界上所有像素(数目为n)进行求和.如果p和q全为0,那么m00实际上对轮廓边界上点的数目.

下面的函数用于计算这些轮廓矩

void cvContoursMoments(CvSeq* contour,CvMoments* moments)

第一个参数是我们要处理的轮廓,第二个参数是指向一个结构,该结构用于保存生成的结果.CvMonments结构定义如下

/* Spatial and central moments */ typedef struct CvMoments { double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; /* spatial moments */ double mu20, mu11, mu02, mu30, mu21, mu12, mu03; /* central moments */ double inv_sqrt_m00; /* m00 != 0 ? 1/sqrt(m00) : 0 */ } CvMoments;

#4


@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口

#5


引用 4 楼 flxshujie 的回复:
@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口


OpenCV3.1.0里有的,参考samples文件里的shape_example.cpp

#6


引用 5 楼 ssbqrm 的回复:
Quote: 引用 4 楼 flxshujie 的回复:

@ssbqrm  比较两个轮廓的相似度  找了一圈,没发现有这个实现啊,matlab代码倒是不少,不晓得大神你说的是哪个接口


OpenCV3.1.0里有的,参考samples文件里的shape_example.cpp

比较两个轮廓的相似度