如何获取轮廓(连通域)的面积、周长、矩形度、圆形度、宽长比、周径比等形状描述符?

博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

目录

    • 前言
    • 1、轮廓面积获取函数
    • 2、轮廓周长获取函数
    • 3、轮廓圆形度计算
    • 4、矩形度计算
    • 5、宽长比计算
    • 6、周径比计算
    • 总结:最终示例

前言

之前学习了连通域和轮廓的知识,其中要框定出自己想要的目标物体,我们往往需要用一些if,else语句用来筛选。
这里整理一下常用的筛选条件。
先验知识链接:

https://blog.csdn.net/qq_42604176/article/details/105588018

1、轮廓面积获取函数

输入当前轮廓点集,输出该轮廓点集的面积

area = contourArea(contours[t]);//计算轮廓面积

2、轮廓周长获取函数

输入当前轮廓点集,第二个参数:bool closed:表示轮廓是否封闭的
输出该轮廓点集的周长

len = arcLength(contours[t], true);//计算轮廓周长

3、轮廓圆形度计算

原本计算公式:
计算公式
网上的公式一般是这个:e=(4π 面积)/(周长 * 周长);
这里将周长等价于2pi*r;

area = contourArea(contours[t]);//计算轮廓面积
len = arcLength(contours[t], true);//计算轮廓周长
roundness = (4 * CV_PI * area) / (len * len);//圆形度

4、矩形度计算

矩形度

//先计算最小外接矩形的面积:
RotatedRect minrect = minAreaRect(contours[t]);	//最小外接矩形
area = contourArea(contours[t]);//计算轮廓面积
int minrectmianji = minrect.size.height * minrect.size.width;
if (minrectmianji == 0)rectangularity = 0;
else rectangularity = area / minrectmianji;

注意点:
minrect.size是个数组,表述的是尺寸即:width,height

5、宽长比计算

宽长比:最小外接矩形的长轴与短轴的比值

RotatedRect rbox = minAreaRect(contours[i]);
fabs(rbox.size.width * 1.0 / rbox.size.height - 1) < 0.1 	//表示宽长比在1附近+-0.1内浮动

6、周径比计算

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

lenratio = len / (minrect.size.height > minrect.size.width ? minrect.size.height : minrect.size.width);

总结:最终示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>  
//#include "My_ImageProssing_base.h"
#define WINDOW_NAME "【程序窗口】"			//为窗口标题定义的宏using namespace cv;
using namespace std;RNG g_rng(12345);int main()
{//改变控制台字体颜色system("color 02");//读取图像Mat src_image = imread("D:\\opencv_picture_test\\阈值处理\\硬币.png", 1);//出错判断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, 100, 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, 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);//画出所有轮廓//初始化周长、面积、圆形度、周径比double len = 0, area = 0, roundness = 0, lenratio = 0;float rectangularity;//循环找出所有符合条件的轮廓for (size_t t = 0; t < contours.size(); t++){Scalar color = Scalar(g_rng.uniform(0, 255),g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值//条件:过滤掉小的干扰轮廓Rect rect = boundingRect(contours[t]);		//垂直边界最小矩形if (rect.width < 10)continue;//画出找到的轮廓drawContours(result_image, contours,t,color,1, 8, hireachy);//绘制轮廓的最小外结矩形RotatedRect minrect = minAreaRect(contours[t]);	//最小外接矩形int minrectmianji = minrect.size.height * minrect.size.width;Point2f P[4];			//四个顶点坐标minrect.points(P);for (int j = 0; j <= 3; j++){line(result_image, P[j], P[(j + 1) % 4], color, 1);}cout << "最小外接矩形尺寸"<< minrect.size << endl;//最小外接矩形尺寸cout << "最小外接矩形面积" << minrectmianji << endl;//最小外接矩形尺寸//绘制轮廓的最小外结圆Point2f center; float radius;minEnclosingCircle(contours[t], center, radius);		//最小外接圆circle(result_image, center, radius, color,1);//计算面积、周长、圆形度、周径比area = contourArea(contours[t]);//计算轮廓面积len = arcLength(contours[t], true);//计算轮廓周长roundness = (4 * CV_PI * area) / (len * len);//圆形度if (minrectmianji == 0)rectangularity = 0;else rectangularity = area / minrectmianji;//周径比,这里的周即周长,径是指上面找到的轮廓最小外接矩形的长的一条边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 << "矩形度:" << rectangularity << endl;cout << "周径比:" << lenratio << endl;}//显示结果namedWindow("轮廓图", WINDOW_NORMAL);imshow("轮廓图", result_image);waitKey(0);return 0;
}

原图:
原图
轮廓效果图:
1
参数一览:
参数


参考链接:

https://blog.csdn.net/Lemon_jay/article/details/89519627
https://blog.csdn.net/qq_42604176/article/details/105588018
https://blog.csdn.net/duiwangxiaomi/article/details/92565308

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01-基础部分

一、tensorflow和opencv测试 import tensorflow as tf import cv2hello tf.constant(hello tensorflow) session tf.Session() print(session.run(hello))print(hello opencv)运行效果如下&#xff1a; 二、基础部分 1、opencv基础 代码三部曲&#xff1a; 1、引入Open…

网络和通信 - Silverlight 中的 HTTP 通信和安全

Silverlight 支持几种使用 HTTP/HTTPS 的方案。虽然可以使用多种方式和技术执行 HTTP 调用&#xff0c;但是下表描述的是针对这些 HTTP 通信方案的建议方法 执行 HTTP 调用的选项 确定应由浏览器还是客户端来执行应用程序的 HTTP 处理后&#xff0c;应在创建任何 Web 请求之前指…

WT2605C高品质音频蓝牙语音芯片:外接功放实现双声道DAC输出的优势

在音频处理领域&#xff0c;双声道DAC输出能够提供更为清晰、逼真的音效&#xff0c;增强用户的听觉体验。针对这一需求&#xff0c;唯创知音的WT2605C高品质音频蓝牙语音芯片&#xff0c;通过外接功放实现双声道DAC输出&#xff0c;展现出独特的应用优势。 一、高品质音频处理…

角点检测(Harris角点检测法)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录原理讲解【1】为何选取角点作为特征&#xff1f;【2】角点的定义&#xff1a;…

02-图像的几何变换

一、图片缩放 imageInfo&#xff1a;图片宽、高、通道个数等 缩放&#xff1a; 等比例缩放&#xff1a;宽高比不变 任意比例缩放&#xff1a;图片拉伸、非拉伸 窗体大小 实现步骤&#xff1a; 1&#xff0c;完成图像的加载&#xff0c;拿到图像的数据信息 2&#xff0c;图片的宽…

微机原理——8086中断类型以及中断向量表、中断响应、中断返回

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录先验知识回顾控制寄存器回顾1、8086中断类型1、外部可屏蔽中断2、外部不可屏蔽…

资料整理-工具篇

* 代码利器 Resharper 作为一个C#er&#xff0c;非常感谢有Resharper这样的代码利器。在VS系列的IDE中&#xff0c;使用Resharper后&#xff0c;你会发现&#xff0c;原来写代码也可以是一种享受&#xff01; 1. 首先&#xff0c;下载Resharper。下载地址&#xff1a;http://ww…

企业级php第三方支付平台,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等 某宝售价3000元...

本帖最后由 商业源码网 于 2017-12-21 11:23 编辑7 h$ . , C u0 R3 R y$ z! ] q( D D$ s( Y源码说明&#xff1a;) G: y; R# G0 0 g N. ; \0 w, A9 {5 # P今天黑锐给大家分享给好东西&#xff01;很不错的支付系统&#xff01;喜欢研究支付接口的朋友别错过&#xff01;ThinkP…

OpenCV实战【2】HOG+SVM实现行人检测

目录HOG是什么&#xff1f;HOG vs SIFTHOG步骤HOG在检测行人中的方式Opencv实现HOGDescriptor的构造函数&#xff1a;行人检测HOGSVM步骤简化版的HOG计算HOG是什么&#xff1f; 方向梯度直方图( Histogram of Oriented Gradient, HOG )特征是一种在计算机视觉和图像处理中用来进…

03-图像特效

一、灰度处理 方法一&#xff1a;imread方法 彩色图的颜色通道为3&#xff0c;即RGB&#xff1b;而灰度图只有一个颜色通道。 import cv2 img0 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,0) img1 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,1) print…

解析linux根文件系统的挂载过程

------------------------------------------ 本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------ 一&#xff1a;前言前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了…

SIFT讲解(SIFT的特征点选取以及描述是重点)

目录SIFT是什么&#xff1f;尺度空间理论SIFT特征点提取SIFT特征点描述SIFT是什么&#xff1f; SIFT ,即尺度不变特征变换( Scale-invariant feature transform&#xff0c;SIFT) ,一种特征描述方法。具有 尺度鲁棒性 旋转鲁棒性 光照鲁棒性 SIFT本身包括了特征点筛选及特征点…

操作系统多线程实现_操作系统中的线程实现

操作系统多线程实现Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

04-图像的形状绘制

一、线段绘制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 参数一&#xff1a;目标图片数据 参数二&#xff1a;当前线段绘制的起始位置&#xff08;也就是两点确定一条直线&#xff09; 参数三&#xff1a;当前线段绘制的终止位置&#xff08;也就是两点确定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程

问题出现&#xff1a;《数字信号处理第三版》第90页刘顺兰版 最后一步怎么得到的&#xff1f; 思路&#xff1a;观察答案&#xff0c;有一个自然对数项。关键就是如何提取出这一项。 我的证明过程如下&#xff1a; 参考链接&#xff1a; 【和差化积】

05-图像的美化

一、彩色图片直方图 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 该方法的所有参数都必须用中括号括起来&#xff01;&#xff01;&#xff01; 参数一&#xff1a;传入的图片数据 参数二&#xff1a;用于计算直方图的通道&#xff0c;这里使用的是灰度直方图&#xff…

Eclipse for android 中设置java和xml代码提示功能(转)

1、设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java &#xff0c;设置框中默认是一个点&#xff0c; 现在将它改为&#xff1a; 以下为引用内容&#xff1a; .a…

如何利用FFT(基2时间以及基2频率)信号流图求序列的DFT

直接用两个例子作为模板说明&#xff1a; 利用基2时间抽取的FFT流图计算序列的DFT 1、按照序列x[k]序号的偶奇分解为x[k]和x2[k]&#xff0c;即x1[k]{1,1,2,1}, x2[k]{-1,-1,1,2} 2、画出信号流图并同时进行计算 计算的时候需要参考基本蝶形单元&#xff1a; 关键在于 (WN) k…

matlab4.0,matlab 4.0

4.1fort-9:0.5:9if(t>0)y-(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);elsey(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);endend编译结果&#xff1a;y248.00t-9.00y221.75t-8.50y197.00t-8.00y173.75t-7.50y152.00t-7.00y131.75t-6.50y113.00t-6.00y95.75t-5.50y80.00t-5.00y65.75t-4.50y…

图形学 射线相交算法_计算机图形学中的阴极射线管

图形学 射线相交算法阴极射线管 (Cathode Ray Tube) Ferdinand Barun of Strasbourg developed the cathode ray tube in the year 1897. It used as an oscilloscope to view and measure some electrical signals. But several other technologies exist and solid state mov…