前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【综合练习】C++ OpenCV实战---获取数量

【综合练习】C++ OpenCV实战---获取数量

作者头像
Vaccae
发布2019-07-24 13:15:08
1.2K0
发布2019-07-24 13:15:08
举报
文章被收录于专栏:微卡智享

前言

前阵子做了一个实战分享《【干货】C++ OpenCV案例实战---卡片截取(附代码)》,今天我们再把以前学习到的东西综合练习一下,做一个获取个数的小案例。

实现效果

我们看到上面这张图片,运用我们学到的OpenCV技术计算出这张图片里面一共有多少颗枣。

实现思路

  • 二值化图像分割
  • 形态学操作(腐蚀+膨胀)
  • 距离变换
  • 连通区域计算
  • 寻找轮廓并计算个数

代码演示

我们再新建一个项目名为opencv--count,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.

首先加载了图片显示出来


二值化图像分割

首先将图片大小调整一下,方便我们显示观看

然后对图像进行高斯模糊,并转为灰度图

再对图像进行二值化操作

我们这里运行一下看看显示效果

上图可以看到右边的图片我们已经进行过二值化处理后的显示效果了


形态学操作

接下来我们要进行形态学的操作,首先看到上面右图,我们的每个枣的里面会有白色的点,是光打上后我们二值化变为的白色,所以我们这里要先进行一下腐蚀操作,把枣里面的白点去掉。

运行起来看

可以看到右图中的白点已经全部处理掉了

接下来我们再进行膨胀的操作,用于把黑色区域进行分割,这里的膨胀操作可以连续做几次,尽量把黑色区域缩小,我的参数里面我做了5次膨胀

再看一下效果

左图是经常五次膨胀后把黑色区域都分割的效果


距离变换

首先将我们的二值化图像黑白反转过来

然后开始距离的变换

接下来再进行归一化处理并显示出来

显示的效果为


连通区域计算

首先我们先建一个8u的图并转换过来

然后我们根据上面图里面白点进行局部阈值二值化处理

显示效果为

可以看到右边基本把白色的连接区域都分割开了,只不过各别地方也有一点白点

然后我们再通过形态学膨胀两次进行处理

把一点白点断开的区域通过膨胀再连接到一起


寻找并计算轮廓

根据上面的图我们在那个基础上寻找轮廓,参数用的CV_RETR_EXTERNAL,这里我们只找最外侧轮廓即可。

根据找到的轮廓画出新图并输出结果,在drawContours里面倒数第二个参数用的-1,这里是代表轮廓画出来后直接填充满了。

运行效果

再看一下输出的值:

回到我们的源图片一下,确实就是12个枣

这一章算是对多个API进行综合的练习进行数量的获取。


-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档