OpenCV粘连对象计数
随着机器视觉和图像处理技术的发展,在工业和生活中都应用广泛。传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开,学习了***贾志刚老师***的OpenCV对象提取与计数课程,现复盘整理如下。
1、方案思路
- 图像预处理,二值化分割;
- 使用形态学操作,初步将粘连对象分开;
- 距离变换,分离粘连对象;
- 连通区域计数。
2、重要函数
全局二值化分割:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
第三个参数,double类型的thresh,阈值的具体值。
第四个参数,double类型的maxval,当第五个参数阈值类型,可取如下值:
THRESH_BINARY=0,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV,THRESH_OTSU,THRESH_TRIANGLE,THRESH_MASK
其中THRESH_OTSU方法在图像灰度中具有明显双峰时,分割效果非常好,自动计算阈值。THRESH_TRIANGLE方法在两个峰值不明显情况下,使用三角形计算方法,本例程使用该种方法,示意图如下:
局部二值化分割:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
参数如下:
InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C:这个参数实际上是一个偏移值调整量
从上面的说明中可以看出,使用函数adaptiveThreshold的关键是确定blockSize和C的值,明白了这两个值的意义之后,在实际项目中,应该可以根据试验法选出较为合适的值!
距离变换:
Opencv中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
void distanceTransform(InputArray src, OutputArray dst,int distanceType,int maskSize);
参数介绍:
src:8位单通道二值图像;
dst:输出距离图像;
distanType:距离类型,取值如下:
maskSize:距离变换掩模大小,通常为3,5。
3、代码实现
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
dilate(binary, binary, kernel,Point(-1,-1),3);//距离变换
Mat dist;
bitwise_not(binary, binary);
distanceTransform(binary, dist, DIST_L2, 3);
normalize(dist, dist, 0, 1.0, NORM_MINMAX);//阈值分割
Mat dist_8u;
dist.convertTo(dist_8u, CV_8U);adaptiveThreshold(dist_8u, dist_8u, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 69, 0.0);
kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
dilate(dist_8u, dist_8u, kernel, Point(-1, -1),2);//连通区域计数vector<vector<Point>>contours;
findContours(dist_8u, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//标记
Mat markers = Mat::zeros(src.size(), CV_8UC3);
RNG rng(12345);
for (size_t t = 0; t < contours.size(); t++) {drawContours(markers, contours, t, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, Mat());
}
cout << "numbers = " << contours.size() << endl;
4、结果实现
OpenCV粘连对象计数相关推荐
- c++实战(OpenCV C++案例实战九《对象计数》)
c++实战(OpenCV C++案例实战九<对象计数>) 一.OpenCV C++案例实战九<对象计数> 一.OpenCV C++案例实战九<对象计数> OpenC ...
- OpenCV 实时对象跟踪(质心跟踪)
本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...
- OpenCV运行对象检测深度学习网络的实例(附完整代码)
OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...
- OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)
OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...
- OpenCV纹理对象的实时姿态估计
OpenCV纹理对象的实时姿态估计 纹理对象的实时姿态估计 目标 理论 源代码 Model 注册 模型检测 解释 读取3D纹理对象模型和对象网格. 接受来自摄像机或视频的输入 从场景中提取ORB特征和 ...
- opencv实现对象跟踪_如何使用opencv跟踪对象的距离和角度
opencv实现对象跟踪 介绍 (Introduction) Tracking the distance and angle of an object has many practical uses, ...
- 一个具有对象计数功能的基类
参考<<More Effective C++>>一书中的条款26:"限制某个class所能产生的对象数量",参照"一个用来计算对象个数的基类&qu ...
- 使用 OpenCV 进行对象跟踪的几种算法解读
使用 OpenCV 进行对象跟踪--算法 在本节中,我们将深入研究不同的跟踪算法.目标不是对每个跟踪器有深入的理论理解,而是从实践的角度理解它们. 让我首先解释跟踪背后的一些一般原则.在跟踪中,我们的 ...
- [Python图像处理] 使用OpenCV检测对象颜色
使用OpenCV检测对象颜色 前言 使用 OpenCV 检测对象颜色 相关链接 前言 检测图像中对象颜色的一种简单方法是首先将图像从 RGB 转换为 HSV 颜色空间,然后使用一系列色调检测对象,这可 ...
最新文章
- tab css html,纯css的tab 切换
- VTK:可视化算法之AnatomicalOrientation
- TFS(Team Foundation Server)介绍和入门
- java文件复制速度_java中文件复制得速度测试
- 原创:PHP内核研究:HASH表和变量
- 9th week blog
- [科技部与你共成长] 倒牛奶
- (34)FPGA原语设计(BUFGMUX)
- 判断点是否在多边形内
- SQL Server 2017 安装过程中的一点说明(有点意思)
- hyper-v 中 安装 Centos 7.0 设置网络 教程
- 支付宝 alipay.fund.trans.uni.transfer(单笔转账接口)功能整合
- 蚂蚁金服 RPC 框架 Sofa-Bolt 结构分析
- 视觉推理(Visual Reasoning)
- php think queue work,thinkphp5.0无法使用think-queue包,php think queue:work命令不存在
- 负雪明烛开通公众号啦~ 欢迎关注「负雪明烛」
- 东南大学 通信工程/电子信息工程 院校分析 通信保研面试重点问题
- 黑客能追回被骗的钱吗
- 卷积神经网络(conv2d参数含义、卷积层、池化层)
- 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)
热门文章
- 服务器系统才有卷影副本吗,windows server 2019没有适合具有卷影副本的卷
- The color “baseBlac in values has no declaration in the base values folder this can lead to crash
- 亲测好用的屏幕录制软件:camtasia2021 mac中文版
- 旧金山第二天: OOW 开始
- 微信小程序授权订阅消息判断用户取消或允许
- Pycharm 对python文件进行打包
- win10 桌面体验 服务器,windows server 2012 R2 安装桌面体验
- SQL SERVER 2008 R2 故障转移群集实验总结
- c语言中反比例函数定义,初三数学反比例函数的定义知识点
- 【MATLAB教程案例15】基于WOA鲸鱼优化算法的函数极值计算matlab仿真及其他应用