点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂

轮廓模型

二值图像分析最常见的一个主要方式就是轮廓发现轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息、常见的如下:

  • 轮廓面积

  • 轮廓周长

  • 轮廓几何矩

  • 轮廓的最小外接矩形

  • 轮廓的最大外接矩形

  • 轮廓的最小外接圆

  • 轮廓的最小外接三角形

  • 轮廓拟合(支持拟合直线、椭圆、圆)

  • 轮廓的凸包

  • 轮廓层次信息提取

  • 多边形逼近

  • 计算欧拉数

函数介绍

OpenCV中提供大量轮廓分析函数,通过这些函数我们可以方便快捷的得到轮廓的各种有用属性信息、高效完成各种二值图像分析需求,下面是我总结的一些常用的函数列表与说明。

OpenCV中轮廓发现函数如下:

void cv::findContours(
InputArray      image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int   mode,
int   method,
Point       offset = Point()
)

参数解释如下:

image: 输入图像、八位单通道的,背景为黑色
contours: 得到的轮廓图像
hierarchy: 层次图像,根据需要提取轮廓层次信息
mode: 决定提取到层次信息内容,是多层还是单层
method: 每个轮廓的编码信息
offset: 表示轮廓偏移,默认为0

轮廓分析相关的常用函数

// 计算轮廓面积
double cv::contourArea(
InputArray contour,
bool oriented = false
)
// 计算轮廓周长
double cv::arcLength(
InputArray      curve,
bool        closed
)
// 计算几何矩与中心距
Moments cv::moments(
InputArray      array,
bool        binaryImage = false
)
// 计算最小外接矩形
RotatedRect cv::minAreaRect(
InputArray      points
)
// 计算最大外接矩形
Rect cv::boundingRect(
InputArray      array
)
// 计算最小外接圆/拟合圆
void cv::minEnclosingCircle(
InputArray      points,
Point2f &        center,
float &    radius
)
// 计算最小外接三角形/拟合三角形
double cv::minEnclosingTriangle(
InputArray      points,
OutputArray   triangle
)
// 拟合直线
void cv::fitLine(
InputArray      points,
OutputArray   line,
int   distType,
double    param,
double    reps,
double    aeps
)
// 拟合椭圆
RotatedRect cv::fitEllipse(
InputArray      points
)
// 计算凸包
void cv::convexHull(
InputArray      points,
OutputArray   hull,
bool        clockwise = false,
bool        returnPoints = true
)
// 多边形逼近-逼近真实形状
void cv::approxPolyDP(
InputArray      curve,
OutputArray   approxCurve,
double    epsilon,
bool        closed
)

灵活使用上述轮廓属性信息,可以实现对二值图像的几何形状判别、测量、面积过滤、获取每个对象的几何属性包括面积、周长、编码点、形状、层次/位置信息、欧拉数、中心位置、倾斜角度。

这里再分享一个硬币计数的例子!

原图如下:

代码如下:

// 加载图像
Mat img = imread("D:/CoinsB.png");
imshow("Original Image", img);// 阈值化操作
Mat gray, binary;
cvtColor(img, gray, COLOR_BGR2GRAY);
float t = threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_OTSU);
imshow("binary", binary);
imwrite("D:/binary1.png", binary);// 形态学操作
Mat se = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binary, binary, MORPH_OPEN, se, Point(-1, -1));// 轮廓发现
vector<Vec4i> hireachy;
vector<vector<Point>> contours;
bitwise_not(binary, binary);
findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
Mat result = img.clone();
Point2f center;
float radius;// 轮廓分析
for (size_t t = 0; t < contours.size(); t++) {double area = contourArea(contours[t]);if (area < 1000) {continue;}RotatedRect rrt = fitEllipse(contours[t]);radius = min(rrt.size.width, rrt.size.height)/2.0;circle(result, rrt.center, radius, Scalar(0, 0, 255), 4, 8, 0);Moments mm = moments(contours[t]);double cx = mm.m10 / mm.m00;double cy = mm.m01 / mm.m00;circle(result, Point(cx, cy), 2, Scalar(255, 0, 0), 2, 8, 0);
}// 显示结果
imshow("result", result);
imwrite("D:/drawing.png", result);
waitKey(0);

最终效果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenCV | 二值图像分析的技巧都在这里相关推荐

  1. OpenCV二值图像分析之形态学应用技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 二值图像分析一块核心技能就是图像形态 ...

  2. 二值图像分析:OpenCV中的二值化阈值操作

    二值图像分析:OpenCV中的二值化阈值操作 1.二值图像的定义 2.OpenCV中的基本阈值操作 3.OTSU二值寻找算法 3.1 OTSU二值寻找算法介绍 3.2 OTSU二值寻找算法分析 3.2 ...

  3. OpenCV二值图像连通域分析

    版权声明:本文为博主原创文章,可以随意共享转载,注明来源即可 https://blog.csdn.net/qq_37059483/article/details/78018539 通域分析对于图像处理 ...

  4. OpenCV——二值图像连通域分析

    通域分析对于图像处理后面涉及到模式识别的内容来说是基础 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Region,Blob).连 ...

  5. 【OpenCV】56 二值图像分析–直线拟合与极值点寻找

    56 二值图像分析–直线拟合与极值点寻找 代码 import cv2 as cv import numpy as npdef canny_demo(image):t = 80canny_output ...

  6. php试卷分析,对试卷分析的必要性与试卷分析的技巧

    考试的功能有两种:检验和选拔.除了中考.高考.竞赛类考试以外,其余几乎都是检验学生对知识的掌握情况,从中发现问题,帮助学生查漏补缺.调整学习方法.所以,考后试卷分析其实是考试的一部分,或者说,与分数的 ...

  7. 小白opencv的入门处理技巧

    小白opencv的入门处理技巧 在这里插入代码片@TOC** 在这里插入代码片 import cv2 import numpy as np #i=cv2.imread("D:\\TP\\MT ...

  8. 如何提高说服力?说服别人的技巧都有哪些?

    如何提高说服力?说服别人的技巧都有哪些? 对于本文标题中的这两个问题,你都可以从经典说服力书籍<沟通与说服必读12篇>中找到答案. 说服力在职场中的重要性毋庸置疑,事实上,说服力早已超出职 ...

  9. 美拍运营技巧都有哪些 如何入门网络媒体行业

    美拍的运营技巧都有哪些?如何入门网络媒体行业?美拍是一款可以直播.制作小视频的受年轻人喜爱的软件.依靠既有的平台生态优势及持续的优质内容运营,美拍已经奉献了诸多形式新颖.效果奇佳的短视频营销案例.下面 ...

最新文章

  1. 转: IO设计模式:Reactor和Proactor对比
  2. RAID之中的RAID5的创建及示例
  3. UVa1346 - Songs(贪心算法)
  4. Eclipse反编译插件安装
  5. androidclient和站点数据交互的实现(基于Http协议获取数据方法)
  6. 多帧点云数据拼接合并_多工作簿数据合并,还在手动复制粘贴就out了,用批处理一键搞定...
  7. shell脚本详解(六)——数组简介和排序算法
  8. ES6 异步编程之二:Promise
  9. 你必须知道的容器监控 (1) Docker自带子命令与Weave Scope
  10. CentOS7 安装ownCloud
  11. PHP程序员最易犯10种错误
  12. 带你自学Python系列(十四):Python函数的用法(四)
  13. 安装sendmail
  14. pytorch torchvision.datasets.ImageFolder
  15. 「雕爷学编程」Arduino动手做(32)——雨滴传感器模块
  16. 数据清洗 excel mysql_Excel获取MYSQL数据库数据
  17. C++11创建线程的三种方式
  18. matlab-gaussmf正态曲线的绘制
  19. 2018-2019-2 20189212 《网络攻防技术》第八周作业
  20. Kernel: 错误:__ib_cache_gid_add: unable to add gid fe80:0000:0000:0000:f816:3eff:fee8:d1de error=-28

热门文章

  1. 50行代码教AI实现动作平衡 | 附完整代码
  2. 英伟达发布RTX 2000系列显卡,“实时光线追踪”究竟能为游戏带来什么?
  3. AI一分钟 | 北京发放自动驾驶首批牌照,百度获准测试;亿航美国分公司申请破产,债务高达数百万美元
  4. 在看不见的地方,AI正在7×24为你在线服务
  5. 这位年仅27岁的阿联酋人工智能部长,竟计划2117年火星造城,真是有钱帅气又任性!
  6. 每一个开发人员都应该懂的 UML 规范
  7. Java必会的工具库,让你的代码量减少90%
  8. 稳~阿里程序员常用的 15 款开发者工具
  9. Spring Boot注解大全,一键收藏了!
  10. 让 Spring Boot 启动更快一点