博主联系方式:
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;
}

原图:

轮廓效果图:

参数一览:


参考链接:

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

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

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

    1.轮廓面积获取函数 输入当前轮廓点集,输出该轮廓点集的面积 area = contourArea(contours[t]);//计算轮廓面积 2.轮廓周长获取函数 输入当前轮廓点集,第二个参数:bo ...

  2. 轮廓的最大面积内接矩形/内接圆计算

    1.求出轮廓重心(X0,Y0). 2.找出轮廓上点到重心的距离最大的点1. 3.连接点到重心形成线段,做线段反向等距离延长线段,得到点2. 4.内接矩形:根据对角线上的(点1,点2),根据旋转矩形和平 ...

  3. 【图像处理】——实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(connectedComponentsWithStats()函数和connectedComponents()函数)

    目录 一.cv2.connectedComponents() 函数原型: 输入参数解析: 返回参数解析: 二.cv2.connectedComponentsWithStats() 函数原型: 输入参数 ...

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

    使用C++.opencv计算轮廓的周长.面积.圆形度.周径比等特征参数 图像的特征参数用于图像的模式识别(图像识别),获取越多种类的特征参数,可从中选择合适的进行组合,进而更好地区分各个物体. 之前介 ...

  5. 获取轮廓、获取内接矩形

    对原图像,使用Imgproc.findContours获取轮廓. 对轮廓,使用Imgproc.minAreaRect获取轮廓的内接矩形(可能会有旋转角度). 对上述内接矩形使用boundingRect ...

  6. 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类): Rect(矩形) Circle(圆形)Rect类的子类: Square(正方形)不同的子类会有不同的计算周长和面

    设计一个形状类(接口)Shape,方法:求周长和求面积 形状类(接口)的子类(实现类):     Rect(矩形)     Circle(圆形) Rect类的子类:     Square(正方形)   ...

  7. 计算矩形和圆形的面积和周长(java)

    package exe02; import java.util.Scanner; /*name:Excise1 功能:计算矩形和圆形的面积和周长*/ public class second1 {pub ...

  8. 矩形面积周长和梯形面积

    矩形梯形面积 矩形面积周长和梯形面积 创建一个Example1.java: public class Example1 { public static void main(String args[]) ...

  9. 【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/

    目录 topic 1:模板匹配 topic 2:图像中寻找轮廓 topic 3:计算物体的凸包 topic 4:轮廓创建可倾斜的边界框和椭圆¶ topic 5:轮廓矩¶ topic 6:为程序界面添加 ...

最新文章

  1. 六式建站浅见,和大家一起分享,不足之处还望斧正。
  2. Opencv--Mat属性step,size,step1,elemSize,elemSize1
  3. PhoneGap出现错误,找不到www/index.html页面
  4. 华为已捐献 HarmonyOS 全部基础能力;腾讯、字节跳动隔空互怼;人人视频从App Store下架整改|极客头条...
  5. access 此程序未正确安装_一款让“微软爸爸杀不死”的数据库软件——生于1992的Access...
  6. c语言引用与指针有什么区别,Java引用与C语言指针的区别
  7. time clock getrusage clock_gettime gettimeofday timespec_get 对比
  8. 音频基础之Smaart7声卡测试
  9. 【IOS账号分享】《NBA 2K20》
  10. Python安装Pandas库
  11. 如何使用STM32 HAL库驱动TFT-LCD实现手画板功能
  12. 360开源的插件化框架Replugin深度剖析
  13. github免费空间玩法
  14. [CLR团队公告]CLR基础研究团队:精品系列推广活动启动
  15. 现在你可以通过深度学习用别人的声音来说话了
  16. 【初码干货】使用阿里云开放搜索服务快速搭建资源搜索网站
  17. 蓝桥七届 凑算式 JAVA
  18. 正则提取文本操作集(python和js)
  19. e3v3服务器性能如何,E3-1230 V3的基本参数是多少? 对比i3 8100哪个性能好?
  20. vscode 安装 eslint 插件

热门文章

  1. UiBot助手使用指南
  2. 灵活用工新趋势,政策来帮忙!
  3. 字符串查找函数Strstr函数的实现(详细易懂)
  4. 【C语言】输入字符串,将字符串逆转
  5. 华为鸿蒙系统p50手机,华为旗舰手机P50延迟发布,鸿蒙系统再次受到质疑,安卓的外壳?...
  6. 现在手机的常用接口有几种
  7. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]
  8. srsLTE+b210 搭建4G微基站
  9. js 前端实现禁用F11开发者工具和鼠标右键。
  10. Android 调试神器-Stetho(Facebook出品)的使用