随着机器视觉和图像处理技术的发展,在工业和生活中都应用广泛。传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开,学习了***贾志刚老师***的OpenCV对象提取与计数课程,现复盘整理如下。
1、方案思路

  1. 图像预处理,二值化分割;
  2. 使用形态学操作,初步将粘连对象分开;
  3. 距离变换,分离粘连对象;
  4. 连通区域计数。

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粘连对象计数相关推荐

  1. c++实战(OpenCV C++案例实战九《对象计数》)

    c++实战(OpenCV C++案例实战九<对象计数>) 一.OpenCV C++案例实战九<对象计数> 一.OpenCV C++案例实战九<对象计数> OpenC ...

  2. OpenCV 实时对象跟踪(质心跟踪)

    本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...

  3. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  4. OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)

    OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...

  5. OpenCV纹理对象的实时姿态估计

    OpenCV纹理对象的实时姿态估计 纹理对象的实时姿态估计 目标 理论 源代码 Model 注册 模型检测 解释 读取3D纹理对象模型和对象网格. 接受来自摄像机或视频的输入 从场景中提取ORB特征和 ...

  6. opencv实现对象跟踪_如何使用opencv跟踪对象的距离和角度

    opencv实现对象跟踪 介绍 (Introduction) Tracking the distance and angle of an object has many practical uses, ...

  7. 一个具有对象计数功能的基类

    参考<<More Effective C++>>一书中的条款26:"限制某个class所能产生的对象数量",参照"一个用来计算对象个数的基类&qu ...

  8. 使用 OpenCV 进行对象跟踪的几种算法解读

    使用 OpenCV 进行对象跟踪--算法 在本节中,我们将深入研究不同的跟踪算法.目标不是对每个跟踪器有深入的理论理解,而是从实践的角度理解它们. 让我首先解释跟踪背后的一些一般原则.在跟踪中,我们的 ...

  9. [Python图像处理] 使用OpenCV检测对象颜色

    使用OpenCV检测对象颜色 前言 使用 OpenCV 检测对象颜色 相关链接 前言 检测图像中对象颜色的一种简单方法是首先将图像从 RGB 转换为 HSV 颜色空间,然后使用一系列色调检测对象,这可 ...

最新文章

  1. tab css html,纯css的tab 切换
  2. VTK:可视化算法之AnatomicalOrientation
  3. TFS(Team Foundation Server)介绍和入门
  4. java文件复制速度_java中文件复制得速度测试
  5. 原创:PHP内核研究:HASH表和变量
  6. 9th week blog
  7. [科技部与你共成长] 倒牛奶
  8. (34)FPGA原语设计(BUFGMUX)
  9. 判断点是否在多边形内
  10. SQL Server 2017 安装过程中的一点说明(有点意思)
  11. hyper-v 中 安装 Centos 7.0 设置网络 教程
  12. 支付宝 alipay.fund.trans.uni.transfer(单笔转账接口)功能整合
  13. 蚂蚁金服 RPC 框架 Sofa-Bolt 结构分析
  14. 视觉推理(Visual Reasoning)
  15. php think queue work,thinkphp5.0无法使用think-queue包,php think queue:work命令不存在
  16. 负雪明烛开通公众号啦~ 欢迎关注「负雪明烛」
  17. 东南大学 通信工程/电子信息工程 院校分析 通信保研面试重点问题
  18. 黑客能追回被骗的钱吗
  19. 卷积神经网络(conv2d参数含义、卷积层、池化层)
  20. 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)

热门文章

  1. 服务器系统才有卷影副本吗,windows server 2019没有适合具有卷影副本的卷
  2. The color “baseBlac in values has no declaration in the base values folder this can lead to crash
  3. 亲测好用的屏幕录制软件:camtasia2021 mac中文版
  4. 旧金山第二天: OOW 开始
  5. 微信小程序授权订阅消息判断用户取消或允许
  6. Pycharm 对python文件进行打包
  7. win10 桌面体验 服务器,windows server 2012 R2 安装桌面体验
  8. SQL SERVER 2008 R2 故障转移群集实验总结
  9. c语言中反比例函数定义,初三数学反比例函数的定义知识点
  10. 【MATLAB教程案例15】基于WOA鲸鱼优化算法的函数极值计算matlab仿真及其他应用