图像的矩

1 矩的计算:moments()函数
Moments moments(InputArray array,bool binaryImage=false)

2 就是轮廓面积:contourArea()函数
double contourArea(InputArray contour,bool oriented=false)

3 计算轮廓长度:arcLength()函数
double arcLength(InputArray curve,bool closed)

//例子

include "opencv2/highgui/highgui.hpp"

include "opencv2/imgproc/imgproc.hpp"

include

using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】--------------------------------------------
// 描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------

define WINDOW_NAME1 "【原始图】" //为窗口标题定义的宏

define WINDOW_NAME2 "【图像轮廓】" //为窗口标题定义的宏

//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage; Mat g_grayImage;
int g_nThresh = 100;
int g_nMaxThresh = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector<vector > g_vContours;
vector g_vHierarchy;

//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
void on_ThreshChange(int, void* );
static void ShowHelpText( );

//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
//【0】改变console字体颜色
system("color 9F");

ShowHelpText();
// 读入原图像, 返回3通道图像数据
g_srcImage = imread( "1.jpg", 1 );

// 把原图像转化成灰度图像并进行平滑
cvtColor( g_srcImage, g_grayImage, COLOR_BGR2GRAY );
blur( g_grayImage, g_grayImage, Size(3,3) );

// 创建新窗口
namedWindow( WINDOW_NAME1, WINDOW_AUTOSIZE );
imshow( WINDOW_NAME1, g_srcImage );

//创建滚动条并进行初始化
createTrackbar( " 阈值", WINDOW_NAME1, &g_nThresh, g_nMaxThresh, on_ThreshChange );
on_ThreshChange( 0, 0 );

waitKey(0);
return(0);

}

//-----------------------------------【on_ThreshChange( )函数】-------------------------------
// 描述:回调函数
//-----------------------------------------------------------------------------------------------
void on_ThreshChange(int, void* )
{
// 使用Canndy检测边缘
Canny( g_grayImage, g_cannyMat_output, g_nThresh, g_nThresh*2, 3 );

// 找到轮廓
findContours( g_cannyMat_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );

// 计算矩
vector<Moments> mu(g_vContours.size() );
for(unsigned int i = 0; i < g_vContours.size(); i++ )
{ mu[i] = moments( g_vContours[i], false ); }

//  计算中心矩
vector<Point2f> mc( g_vContours.size() );
for( unsigned int i = 0; i < g_vContours.size(); i++ )
{ mc[i] = Point2f( static_cast<float>(mu[i].m10/mu[i].m00), static_cast<float>(mu[i].m01/mu[i].m00 )); }

// 绘制轮廓
Mat drawing = Mat::zeros( g_cannyMat_output.size(), CV_8UC3 );
for( unsigned int i = 0; i< g_vContours.size(); i++ )
{
    Scalar color = Scalar( g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255) );//随机生成颜色值
    drawContours( drawing, g_vContours, i, color, 2, 8, g_vHierarchy, 0, Point() );//绘制外层和内层轮廓
    circle( drawing, mc[i], 4, color, -1, 8, 0 );;//绘制圆
}

// 显示到窗口中
namedWindow( WINDOW_NAME2, WINDOW_AUTOSIZE );
imshow( WINDOW_NAME2, drawing );

// 通过m00计算轮廓面积并且和OpenCV函数比较
printf("\t 输出内容: 面积和轮廓长度\n");
for(unsigned  int i = 0; i< g_vContours.size(); i++ )
{
    printf(" >通过m00计算出轮廓[%d]的面积: (M_00) = %.2f \n OpenCV函数计算出的面积=%.2f , 长度: %.2f \n\n", i, mu[i].m00, contourArea(g_vContours[i]), arcLength( g_vContours[i], true ) );
    Scalar color = Scalar( g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255) );
    drawContours( drawing, g_vContours, i, color, 2, 8, g_vHierarchy, 0, Point() );
    circle( drawing, mc[i], 4, color, -1, 8, 0 );
}

}

//-----------------------------------【ShowHelpText( )函数】-----------------------------
// 描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
//输出欢迎信息和OpenCV版本
printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
printf("\n\n\t\t\t此为本书OpenCV3版的第76个配套示例程序\n");
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION );
printf("\n\n ----------------------------------------------------------------------------\n");
}

原文地址:https://www.cnblogs.com/shuguomeifuguo/p/12005177.html

时间: 2024-08-30 13:12:41

图像的矩的相关文章

图像特征提取:图像的矩特征

1. 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好.良好的特征不受光线.噪点.几何形变的干扰.图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个. 矩是概率与统计中的一个概念,是随机变量的一种数字特征.设X为随机变量,c为常数,k为正整数.则量E[(x−c)k]称为X关于c点的k阶矩. 比较重要的有两种情况: 1. c=0.这时ak=E(Xk)称为X的k阶原点矩 2. c=E(X).这时μk

图像的矩 图像的轮廓面积和长度

1. 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好.良好的特征不受光线.噪点.几何形变的干扰.图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个. 矩是概率与统计中的一个概念,是随机变量的一种数字特征.设XX为随机变量,cc为常数,kk为正整数.则量E[(x?c)k]E[(x?c)k]称为XX关于cc点的kk阶矩. 比较重要的有两种情况: 1. c=0c=0.这时ak=E(Xk)ak=E(X

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,opencv提供了一个函数,用来获得这些点的集合 API:void finContours(输入图像,输出轮廓点集,输出向量,int 轮廓检索模式,int 轮廓近似方法,Point 轮廓点的可选偏移量) 注:1.输入图像,是

Robotics Lab3 ——图像特征匹配、跟踪与相机运动估计

Robotics Lab3 --图像特征匹配.跟踪与相机运动估计 图像特征匹配 图像特征点 携带摄像头的机器人在运动过程中,会连续性地获取多帧图像,辅助其感知周围环境和自身运动.时间序列上相连的两幅或多幅图像,通常存在相同的景物,只是它们在图像中的位置不同.而位置的变换恰恰暗含了相机的运动,这时就需要相邻图像间的相似性匹配. 选取一大块图像区域进行运动估计是不可取的.已知图像在计算机内部是以数字矩阵的形式存储的,[如灰度图的每个元素代表了单个像素的灰度值].而对于点的提取和匹配较为方便,且和数字

Opencv图像识别从零到精通(23)----轮廓

当看到轮廓的时候,发现没有办法具体到什么, 因为关系轮廓的东西似乎有很多,例如检测轮廓,提取轮廓,轮廓跟踪,轮廓面积,周长,标记,匹配,还有一系列的外接最小矩形,圆形,椭圆,图像矩,填充孔洞等,不得不说东西真的很好. 轮廓其实最容易和边缘检测联系到一起,有很多的相同,但是我理解的是边缘是检测,是预处理,而轮廓就可能是你要用的特征. 一.函数:一个是找,一个是画 <span style="font-size:18px;">void findContours//提取轮廓,用于提

图像处理URL

随笔分类 - 图像处理/图像增强等 图像增强: 图像复原: 图像重建: 图像分割: 图像特效: 图像匹配: 图像形态学处理: 图像几何处理: 图像正交变换: 人工智能: 跟踪: 图像处理之增强---图像模糊检测 摘要: 这种检测可以做宽动态的检测,也可应用稳像算法我们实现了拉普拉斯方差算法,该算法提供给我们一个浮点数来代表具体图像的"模糊度".该算法快速,简单且易于使用--用拉普拉斯算子与输入图像做卷积然后计算方差即可.如果方差低于预定义阈值,图像就被标记为"模糊"

【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配

http://blog.csdn.net/abc8730866/article/details/69219992 轮廓特征属性及应用(七)-位置关系及轮廓匹配 1.计算点与轮廓的距离及位置关系--pointPolygonTest() 2.矩的计算--moments() 3.形状匹配(比较两个形状或轮廓间的相似度)--matchShapes() 先上ppt: 代码:1.计算点到轮廓的距离与位置关系 [cpp] view plain copy ///计算点到轮廓的距离与位置关系 #include "

Contour Features 边界特征

查找轮廓 findContours 1 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy 参数解释 image:原图像,可以事先由compare().inRange().threshold()等得到binary的image图像 mode:轮廓检索模式 method:轮廓近似方法 mode参数可取值为 CV_RETR_EXTERNAL 仅检索外部

OpenCV3编程入门_毛星云编著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容提要OpenCV在计算机视觉领域扮演着重要的角色.作为一个基于开源发行的跨平台计算机视觉库,OpenCV实现了图像处理和计算机视觉方面的很多通用算法.<OpenCV3编程入门>以当前最新版本的OpenCV最常用最核心的组件模块为索引,深入浅出地介绍了OpenCV2和OpenCV3中的强大功能.性能,以及新特性.书本配套的OpenCV2和OpenCV3双版本的示例代码包中,含有总计两百多个详细注释的程序源代码与思路说明.读者可以按图索骥,按技术方向进行