OpenCV 轮廓矩

一、概述

我们在实际中如何应用这些轮廓呢?比如,有两个轮廓如何进行比较匹配,或者如何比较一个轮廓和一个抽象模板。比较两个轮廓最简洁的方式是比较它们的轮廓矩。矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个粗略特征。

二、矩及Hu矩的结构体

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;

//Hu矩

typedef struct CvHuMoments

{

double hu1, hu2, hu3, hu4, hu5, hu6, hu7; /* Hu invariants */

}

CvHuMoments;

三、相关函数

1、计算轮廓矩

void  cvContoursMoments(CvSeq* contour,  CvMoments* moments)

contour

要处理的轮廓

moments

指向一个结构,该结构用于保存生成的结果。

在二值图像的情况下,M00表示区域的面积。令Xc,Yc表示区域重心的坐标,则:Xc = M10/M00;
Yc = M01/M00;

2、计算7 Hu 不变量

void cvGetHuMoments( CvMoments* moments, CvHuMoments* hu_moments );

moments

矩状态结构的指针

hu_moments

Hu 矩结构的指针.

函数 cvGetHuMoments 计算 7 个 Hu 不变量,它们的定义是:

h1=η20+η02

h2=(η20-η02)2+4η112

h3=(η30-3η12)2+ (3η21-η03)2

h4=(η30+η12)2+ (η21+η03)2

h5=(η30-3η12)(η30+η12)[(η30+η12)2-3(η21+η03)2]+(3η21-η03)(η21+η03)[3(η30+η12)2-(η21+η03)2]

h6=(η20-η02)[(η30+η12)2- (η21+η03)2]+4η11(η30+η12)(η21+η03)

h7=(3η21-η03)(η21+η03)[3(η30+η12)2-(η21+η03)2]-(η30-3η12)(η21+η03)[3(η30+η12)2-(η21+η03)2]

这些值被证明为对图像缩放、旋转和反射的不变量。对反射,第7个除外,因为它的符号会因为反射而改变。

3、使用Hu矩进行匹配

double cvMatchShapes( const void* object1, const void* object2,
                      int method, double parameter=0 );

object1

第一个轮廓或灰度图像

object2

第二个轮廓或灰度图像

method

比较方法,其中之一 CV_CONTOUR_MATCH_I1, CV_CONTOURS_MATCH_I2 or CV_CONTOURS_MATCH_I3.

parameter

比较方法的参数 (目前不用).

函数 cvMatchShapes 比较两个形状。 三个实现方法全部使用 Hu 矩

method=CV_CONTOUR_MATCH_I1:

method=CV_CONTOUR_MATCH_I2:

method=CV_CONTOUR_MATCH_I3:

时间: 2024-11-10 14:16:11

OpenCV 轮廓矩的相关文章

[转载]转载,opencv轮廓查找,匹配以及特征提取,实例

已有 9450 次阅读 2012-3-15 20:50 |系统分类:科研笔记|关键词:opencv 轮廓 轮廓的查找.表达.绘制.特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match) 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线.前面讲了如何根据色彩及色彩的分布(直方图对比和模板匹配)来进行匹配,现在我们来看看如何利用物体的轮廓.包括以下内容:轮廓的查找.表达方式.组织方式.绘制.特性.匹

OpenCV —— 轮廓

把检测出的边缘像素组装成轮廓  --  cvFindContours   OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储器可以通过四个函数访问 : cvCreateMemStorage(创建一个内存存储器,0采用默认大小)    cvReleaseMemStorage   cvClearMemStorage(和通常释放内存的函数区别 -- 只是将释放的内存返还给内存存储器,而并不返还给系统 -- 可以重复使用内存

OpenCV 轮廓基本特征

一.概述 我们通过cvFindContours( )函数获取得图像轮廓有何作用呢?一般来说,我们对轮廓常用的操作有识别和处理,另外相关的还有多种对轮廓的处理,如简化或拟合轮廓,匹配轮廓到模板,等等. 我们在轮廓处理中经常需要对轮廓变化一些特征进行概括,比如长度或者一些反映轮廓整体大小的度量.另外轮廓矩也是概括轮廓的特征的重要方法. 二.常见特征函数 1.多边形逼近 CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemSt

OpenCV轮廓检测,计算物体旋转角度

效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/core/core.h

Opencv 图像矩

#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; Mat img1, img2, img3, img4, img_result, img_gray1, img_gray2, img_gray3, img_canny1; char win1[] = "window1";char win2[] = "window2";c

Opencv轮廓计数(学习)

#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/xfeatures2d.hpp> using namespace std;using namespace cv;using namespace cv::xfeatures2d; Mat img1, img2, img3, img4, img5, img6, img_result, img_gray1, img_gray2, img_gray

OpenCV 轮廓的凸性

一.概括 理解物体形状或轮廓的另外一种有用的方法是计算一个物体的凸包(convex hull)然后计算其凸缺陷(convexity defects).很多复杂物体的特性能很好的被这种缺陷表现出来. 二.相关函数 1.发现点集的凸外形 CvSeq* cvConvexHull2( const CvArr* input, void* hull_storage=NULL, int orientation=CV_CLOCKWISE, int return_points=0 ); points 2D 点集的

opencv 轮廓点的坐标大小的修改

std::vector> allcontourpoint; //点集的数据集 for(int i=0; iopencv 轮廓点的坐标大小的修改 原文地址:https://www.cnblogs.com/rjjhyj/p/11479774.html

opencv 轮廓的外围多边形提取或者删除最小最大轮廓

std::vector resultpoly; cv::approxPolyDP(contours[0], resultpoly,4, true);//轮廓contours[0] ,resultpoly多边形的点集 cv::polylines(src, resultpoly, true, 150, 1);//画多边形的外轮廓 cv::imshow("detected polyLines", src);//显示多边形的外轮廓 //相关链接https://www.cnblogs.com/d