计算轮廓的特征参数(周长、面积、圆形度、周径比等)

C C++最新计算轮廓的特征参数(周长、面积、圆形度、周径比等)_c(2),C C++开发者面试如何系统复习 其他知识点:所谓周长、面积等肯定不是物体真实的周长面积,代码所求的周长面积都是以像素点为单位,周长就是轮廓点集合的个数(以1像素点为步长),面积就是轮廓所围的所有像素点个数,所以想知道物体的真实周长面积,可以在图像中加入一个标准物体(如一张A4纸),并在找到、计算物体的参数时同时要找到、计算标准物体的参数,再进行换算。**points:**输入的点集(轮廓),可以为包含点的容器(vector)或是Mat。**InputArray points:**表示输入的点集(轮廓)之前介绍过获取图像的灰度共生矩阵( 阅读详情

使用C++、opencv计算轮廓的周长、面积、圆形度、周径比等特征参数

图像的特征参数用于图像的模式识别(图像识别),获取越多种类的特征参数,可从中选择合适的进行组合,进而更好地区分各个物体。

之前介绍过获取图像的灰度共生矩阵(https://blog.youkuaiyun.com/Lemon_jay/article/details/89455887)、不变矩(https://blog.youkuaiyun.com/Lemon_jay/article/details/89457633)、傅立叶描述子(https://blog.youkuaiyun.com/Lemon_jay/article/details/89349006)等,此次根据物体的轮廓进而计算出轮廓的周长、面积、圆形度、周径比等特征参数。还可自行拓展,如物体面积与最小外接矩形面积比、与最小外接圆的面积比、(最大)内切圆与物体面积比等。


opencv中相关API:

RotatedRect minAreaRect(InputArray points)

minAreaRect()函数的作用是找到轮廓的最小外接矩形

InputArray points:表示输入的点集(轮廓)

输出是矩形的四个点坐标

 void minEnclosingCircle(InputArray points, Point2f& center, float& radius)

points:输入的点集(轮廓),可以为包含点的容器(vector)或是Mat。

center:返回包覆圆形的圆心。

radius:返回包覆圆形的半径。


其他知识点:所谓周长、面积等肯定不是物体真实的周长面积,代码所求的周长面积都是以像素点为单位,周长就是轮廓点集合的个数(以1像素点为步长),面积就是轮廓所围的所有像素点个数,所以想知道物体的真实周长面积,可以在图像中加入一个标准物体(如一张A4纸),并在找到、计算物体的参数时同时要找到、计算标准物体的参数,再进行换算。

圆形度计算公式采用的是:e=(4π*面积)/(周长*周长)

周径比的周即周长,径是指上面找到的轮廓最小外接矩形的长的一条边


代码如下:

#include "stdafx.h"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>  
#include <math.h>  

using namespace cv;
using namespace std;

int main()
{
	//改变控制台字体颜色
	system("color 02");
	
	//读取图像
	Mat src_image = imread("C:\\1.jpg");
	//出错判断
	if (!src_image.data)
	{
		cout << "src image load failed!" << endl;
		return -1;
	}
	//显示原图
	namedWindow("原图", WINDOW_NORMAL);
	imshow("原图", src_image);

	//高斯滤波去噪声
	Mat blur_image;
	GaussianBlur(src_image, blur_image, Size(3, 3), 0, 0);
	imshow("GaussianBlur", blur_image);

	//灰度变换与二值化
	Mat gray_image, binary_image;
	cvtColor(blur_image, gray_image, COLOR_BGR2GRAY);
	threshold(gray_image, binary_image, 50, 255, THRESH_BINARY);
	imshow("binary", binary_image);

	//形态学闭操作(粘合断开的区域)
	Mat morph_image;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(binary_image, morph_image, MORPH_CLOSE, kernel, Point(-1, -1), 1);
	imshow("morphology", morph_image);

	//查找所有外轮廓
	vector< vector<Point> > contours;
	vector<Vec4i> hireachy;
	findContours(binary_image, contours, hireachy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE, Point());

	//定义结果图
	Mat result_image = Mat::zeros(src_image.size(), CV_8UC3);

	//drawContours(result_image, contours, -1, Scalar(0, 0, 255), 1, 8, hireachy);//画出所有轮廓

	//颜色表,用不同颜色画出找到的不同轮廓
	Scalar color[] = { Scalar(0,0,255), Scalar(0,255,0), Scalar(255,0,0), Scalar(255,255,0) ,Scalar(255,0,255) };
	
	//初始化周长、面积、圆形度、周径比
	double len = 0, area = 0, roundness = 0, lenratio = 0;

	//循环找出所有符合条件的轮廓
	for (size_t t = 0; t < contours.size(); t++)
	{
		//条件:过滤掉小的干扰轮廓
		Rect rect = boundingRect(contours[t]);
		if (rect.width < 10)
			continue;
		//画出找到的轮廓
		drawContours(result_image, contours, static_cast<int>(t), Scalar(255, 255, 255), 1, 8, hireachy);

		//绘制轮廓的最小外结矩形
		RotatedRect minrect = minAreaRect(contours[t]);
		Point2f P[4];
		minrect.points(P);
		for (int j = 0; j <= 3; j++)
		{
			line(result_image, P[j], P[(j + 1) % 4], color[t], 1);
		}
		//cout << minrect.size << endl;//外接矩形尺寸

		//绘制轮廓的最小外结圆
		Point2f center; float radius;
		minEnclosingCircle(contours[t], center, radius);
		circle(result_image, center, radius, color[t], 1);

		//计算面积、周长、圆形度、周径比
		area = contourArea(contours[t]);//面积
		len = arcLength(contours[t], true);//周长
		roundness = (4 * CV_PI*area) / (len*len);//圆形度
		//周径比,这里的周即周长,径是指上面找到的轮廓最小外接矩形的长的一条边
		lenratio = len / (minrect.size.height > minrect.size.width ? minrect.size.height : minrect.size.width);

		//输出结果
		cout << "轮廓" << t <<":"<< endl;
		cout << "周长:" << len << endl;
		cout << "面积:" << area << endl;
		cout << "圆形度:" << roundness << endl;
		cout << "周径比:" << lenratio << endl;

	}
	//显示结果
	namedWindow("轮廓图", WINDOW_NORMAL);
	imshow("轮廓图", result_image);

	waitKey(0);
	return 0;
}

 源图像(为显示效果,一张图中有三个待计算的物体):

结果图:

 

结果数据:

 

可根据轮廓为几,和颜色表,找到对应轮廓,查看该轮廓信息,也可添加文件写入操作保存轮廓的信息。

 另外还可计算最小外接矩形的面积、最小外接圆的面积、(最大)内切圆(https://blog.youkuaiyun.com/Lemon_jay/article/details/89467577)的面积进而计算更多的特征参数。

C C++最全计算轮廓的特征参数(周长、面积、圆形度、周径比等)_c,2024年最新31道C C++面试题 【代码】C C++最全计算轮廓的特征参数(周长、面积、圆形度、周径比等)_c,2024年最新31道C C++面试题。 阅读详情

相关推荐

C++OpenCV进行轮廓提取及计算图像的面积周长

C++项目实战,计算周长、面积、轮廓

bigData1994pb的博客 3503

模式特征

1.模式特征 (1)全局特征   全局特征通常是图像区域的一些特征,如面积、周长、傅里叶描述子和矩特征等。全局特征可以通过考虑区域内的所有点来得到,或只考虑区域边界上的所有点来得到。在每一种情况下,目的都是为了描述子,该描述子是通过考虑所有点位置、强度特性和空间关系来得到。 (2)局部特征   局部特征通常位于物体的边界上或者表示区域中可分辨的一个小曲面,比如曲率及其有关的性质就属于局部特征。曲率可能是边界曲率,也可能是从曲面上计算出来的。曲面可以是强度曲面,或者2.5维空间曲面。一些常用的局部特征由曲率、

图像学习之旅 1046

浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

迪杰斯特拉(Dijkstra)算法和A*算法的原理及实现。

Guo_Zhanyu 9599

[攻略][Matlab][C++][opencv]Matlab及C++ Opencv求图像的连通区域的圆度并可视化

1、Matlab 代码 %% 圆度的计算 % 圆形需要是白色的,背景是黑色的,可以根据需要确定是否对图像进行反向 clc clear;close all; % %读取源图像 I = imread('1.bmp'); % figure;imshow(I); % %灰度化、取反 h = I; if ndims(h) == 3 h = rgb2gray(I); end % figure;imshow(h);%灰度图像 % h = imcomplement(h);%取反 %

指甲的博客 3829

将AD域服务从windows server 2008 R2 迁移到windows server 2019

添加一台windows 2019 的服务器并加入现有林的域中,并将角色升级为域控制器。然后迁移FSMO角色,使其成为PDC,然后降级旧DC,并提升域和林的功能级别。最后还要说下,Server 2008 R2我们还可以删除角色并退出当前域,这里就不做操作了。2)右键 mingling.com(我的域为mingling.com)--提升域级别功能。勾选 将域控制器添加到现有域,使用域管理员将DC2加入到现有的AD域。1)打开服务器管理器---工具---AD域和信任关系。2)运行域安装服务向导,选择下一步。

lionxam的博客 3660

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

C++有关圆的计算(详细版)详细做法教程

有关圆的计算的C++程序,支持12种运算,分为求半径、求直径、求周长、求面积四大类。

weixin_46725895的博客 5496

Python与numpy版本兼容性排查指南

本文详细解析了Python与numpy版本兼容性问题,提供了快速诊断和解决版本冲突的实用方法。通过查看版本信息、使用官方兼容性对照表以及降级或升级环境等方案,帮助开发者有效避免常见的报错问题,如'ImportError'和'AttributeError'。文章还介绍了使用虚拟环境和requirements.txt等工程实践,确保项目依赖的稳定性。

weixin_29089057的博客 319

图像处理(4)

这里的内容是之前黄学姐没有整理的,同样声明:以下内容没考到概不负责。 目录 Marr边缘检测方法 基于直方图阈值的图像分割中,最佳阈值是如何选取? 图像特征提取,位置与方向,长轴与短轴,周长,面积,距离矩形度,宽长比,圆形度,球状度,偏心率 位置与方向: 长轴和短轴: 周长: 面积: 距离: 矩形度: 宽长比: 圆形度: 球状度: 偏心率: 特征的距离测量:欧...

Asber的博客 3611

制造业与工业知识图谱应用

在全球数字化转型背景下,制造业面临创新周期缩短、质量管控精细化等挑战。知识图谱技术通过结构化表示工业知识,为智能制造提供关键技术支撑。工业知识图谱具有专业性强、多源异构数据融合、实时性要求高等特点,其构建流程涵盖本体设计、知识抽取与整合等环节。研究显示,知识图谱与大模型结合可提升工业场景的智能化水平,在设备故障诊断、供应链优化等领域具有显著应用价值。该技术有望成为制造业数字化转型的核心驱动力。

分享一些感兴趣的技术方面 1442

黑猫带你学eMMC协议第2篇:eMMC部分相关名词释义

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 本文背景 本文关键词不包括emmc jedec5.1协议第3章节:《Terms and definitions》内容。关于emmc协议层的关键词,直接查阅spec相关章节即可,清晰明了,此处没必要再列出。 本文为本人工作学习中常听到或常用到关乎于emmc/flash的一些关键词合集,没有固定分类,不需要强行记忆,供查询使用。 1.

黑猫奥利奥的博客 7433

2024年最新计算轮廓的特征参数(周长、面积、圆形度、周径比等)_c(1),2024年最新2024网易C C++高级面试题总结

其他知识点:所谓周长、面积等肯定不是物体真实的周长面积,代码所求的周长面积都是以像素点为单位,周长就是轮廓点集合的个数(以1像素点为步长),面积就是轮廓所围的所有像素点个数,所以想知道物体的真实周长面积,可以在图像中加入一个标准物体(如一张A4纸),并在找到、计算物体的参数时同时要找到、计算标准物体的参数,再进行换算。**points:**输入的点集(轮廓),可以为包含点的容器(vector)或是Mat。**InputArray points:**表示输入的点集(轮廓)

2401_84975241的博客 378

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

轮廓特征!面积,周长!你真的了解你算的是啥吗?

面积和周长是轮廓的两大特征,可以很方便的由contourArea和arcLength函数求出。然而我们求出的到底是什么呢? 简单的说就是,它们是用像素个数来表示的。我们先看面积是如何求的: 我们假定一条闭合轮廓由N个顶点组成,已知的先验知识是特征运算将**顶点视为像素中心点**。如下图(来源于参考博客1),面积为各像素中轮廓所占比例之和。 ![轮廓的面积](https://img-blog.csdnimg.cn/20200518175403364.jpg?x-oss-process=image/waterm

qq_44685030的博客 1091

Qt | 开发过程中总结的经验

关于如何判断自己的Qt库是多少位,有个误区就是很多人要么看成了QtCreator的关于信息中列出的位数,要么以为自己是64位的系统就认为是64位的Qt,最终要在Qt构建套件中查看具体位数,大概从Qt5.14开始基本上很少提供32位的库,尤其是Qt6.0以后基本上默认就是只有64位的库了,这也是顺应时代潮流,毕竟不久的将来(个人预计2030年以前)基本上32位的系统占比不超过1%,放心大胆的用64位的库吧,抛弃烦人的32位以及XP系统。Qt常用类的头文件的函数看完学完使用一遍并加以融会贯通,月薪30K起步。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 491

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

图像处理中的圆形度形状特征提取方法

需要注意的是,圆形度作为一种简单的形状特征提取方法,对于复杂的形状可能不够准确或完备。在图像处理中,圆形度(Circularity)是一种常用的形状特征提取方法,用于评估轮廓形状与理想圆形之间的相似程度。圆形度可以用于检测和描述图像中的圆形目标或评估轮廓的圆形度。圆形度可以用于形状描述和形状匹配等应用中,对于圆形目标或近似圆形目标具有很好的效果。计算特征:计算轮廓的圆形度特征。其中,轮廓面积可以通过计算轮廓包围的像素数量得到,轮廓周长可以通过计算轮廓上的像素数量得到,而 π 是圆周率。

嵌入式之斋 1506

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Opencv C++ 绘制椭圆/圆形

Opencv C++ 绘制椭圆/圆形 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace cv; using namespace std; //绘制椭圆; void DrawEllipse(Mat img, double angle, int nThickne

廷益_飞鸟的博客 4923

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++语言的学习——与圆相关的计算

与圆相关的计算 描述 给出圆的半径,求圆的直径、周长和面积。 输入 输入包含一个实数r(0 < r <= 10,000),表示圆的半径。 输出 输出一行,包含三个数,分别表示圆的直径、周长、面积,数与数之间以一个空格分开,每个数保留小数点后4位。 样例输入 3.0 样例输出 6.0000 18.8495 28.2743 源代码 #include<iostream> #inc...

qq_45630650的博客 5683

python 计算圆形度。

如何使用python 计算圆形度

Kp0fS的草稿纸 1812

【OpenCV 4开发详解】轮廓面积与长度

本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 轮廓面积 轮廓面积是轮廓重要的统计特性之一,通过轮廓面积的大...

小白学视觉 4633

OpenCV 真圆度测量

为此,我采用了个变通的方法。对这个轮廓先计算最小二乘拟合圆。之后计算轮廓上的各个点到圆心的距离。最大距离减去最小距离的差可以作为真圆度的一个近似的计算。对于一个轮廓,我们可以求出这个轮廓的外接圆和内切圆。这两个圆的半径差定义为真圆度。这个数值越小,表示这个圆越标准。外接圆在 OpenCV 中有现成的函数来计算,但是内切圆是没有的。去算内切圆难度还是蛮大的。最近一个项目需要在图像上测量一些小孔的真圆度。因此专门研究了一下真圆度计算问题。真圆度的计算代码封装到了一个类里。下面是个简单的测试用例。

Ivan 的专栏 2628

【OpenCV】获取轮廓(连通域)的面积、周长、矩形度、圆形度、宽长比、周径比

获取轮廓(连通域)的面积、周长、矩形度、圆形度、宽长比、周径比

豆芽菜 1万+

boundingRect函数

1、boundingRect函数 函数作用: 计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的 2、boundingRect函数调用形式 C++: Rect boundingRect(InputArray points) points 二维点集,点的序列或向量 (Mat)  3、opencv代码 #include "opencv2/hi

qq_18343569的博客 4万+

c++和opencv小知识:计算轮廓的矩、面积、周长等

获取图片轮廓的后处理 #include<iostream> #include<opencv2/opencv.hpp> #include<vector> using namespace cv; using namespace std; int main() { Mat srcImage = imread("contours.jpg",0); if (src...

qq_43702097的博客 2405

opencv基础之测试质心和圆形度

#include<iostream> #include"opencv2\opencv.hpp" #include<math.h> using namespace std; using namespace cv; RNG g_rng(12345); int g_nElementShape=MORPH_RECT; Mat srcImage, dstImage; void cen...

monk1992的博客 876

轮廓圆度计算方式

Halcon中圆度计算方式 设p为区域中心点(质点),p_i为轮廓上全部像素点,F为轮廓面积(此处指轮廓像素点个数,并不是轮廓所围成区域的面积) Distance为轮廓上像素点到中心的平均距离,Sigma为轮廓像素点到中心的距离与平均距离的偏差 Roundness则表示平均值与标准差之间的关系 另一种计算方式 Roundness = (4 * CV_PI面积) / (周长周长) 其中面积为轮廓区...

snipertly的博客 1万+
上一篇: opencv处理视频文件
下一篇: 调节彩色图像亮度(基于不同的颜色空间)
Lemon_jay
博客等级 码龄9年 109粉丝 26原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值