前言
前阵子做了一个实战分享《【干货】C++ OpenCV案例实战---卡片截取(附代码)》,今天我们再把以前学习到的东西综合练习一下,做一个获取个数的小案例。
实现效果
我们看到上面这张图片,运用我们学到的OpenCV技术计算出这张图片里面一共有多少颗枣。
实现思路
代码演示
我们再新建一个项目名为opencv--count,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.
首先加载了图片显示出来
二值化图像分割
首先将图片大小调整一下,方便我们显示观看
然后对图像进行高斯模糊,并转为灰度图
再对图像进行二值化操作
我们这里运行一下看看显示效果
上图可以看到右边的图片我们已经进行过二值化处理后的显示效果了
形态学操作
接下来我们要进行形态学的操作,首先看到上面右图,我们的每个枣的里面会有白色的点,是光打上后我们二值化变为的白色,所以我们这里要先进行一下腐蚀操作,把枣里面的白点去掉。
运行起来看
可以看到右图中的白点已经全部处理掉了
接下来我们再进行膨胀的操作,用于把黑色区域进行分割,这里的膨胀操作可以连续做几次,尽量把黑色区域缩小,我的参数里面我做了5次膨胀
再看一下效果
左图是经常五次膨胀后把黑色区域都分割的效果
距离变换
首先将我们的二值化图像黑白反转过来
然后开始距离的变换
接下来再进行归一化处理并显示出来
显示的效果为
连通区域计算
首先我们先建一个8u的图并转换过来
然后我们根据上面图里面白点进行局部阈值二值化处理
显示效果为
可以看到右边基本把白色的连接区域都分割开了,只不过各别地方也有一点白点
然后我们再通过形态学膨胀两次进行处理
把一点白点断开的区域通过膨胀再连接到一起
寻找并计算轮廓
根据上面的图我们在那个基础上寻找轮廓,参数用的CV_RETR_EXTERNAL,这里我们只找最外侧轮廓即可。
根据找到的轮廓画出新图并输出结果,在drawContours里面倒数第二个参数用的-1,这里是代表轮廓画出来后直接填充满了。
运行效果
再看一下输出的值:
回到我们的源图片一下,确实就是12个枣
这一章算是对多个API进行综合的练习进行数量的获取。
-END-