前言

还记得这个图吗?前阵子有篇文章《【综合练习】C++OpenCV实战---获取数量》里面中我们利用学到了一些OpenCV的基本知识进行了数量的提取。当时算是完成了,可以看看文章中的实现思路

里面用到了距离变换,连通区域计算,还是归一化等一些API,比较烦所,其中里面一个最关键的问题是通过图像二值化后进行形态学操作,需要反复不停的测试找到一个合适的点才能把最左侧的两个枣区分开,上一章中我们学习了InRange利用HSV颜色分割,我们看看利用颜色分割和上次获取数量有什么不同。
实现思路
- 利用HSV颜色进行分割
- 形态学操作(一般用开操作即可)
- 寻找轮廓并计算个数
看看上面的实现思路,对比前面我们那一篇,感觉是不是简化了不少,下面我们进行代码演示。
代码演示
我们再新建一个项目名为opencv--inrange,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法。
1.加载图像

2.高斯模糊,定义颜色并进行颜色分割

3.形态学操作,做两次开操作

4.寻找轮廓并画出轮廓

5.打印出轮廓个数及显示图像

接下来我们看看运行后的效果

左下角红色框里可以看到我们获取到的12个数量完全正确,左上角的我们的原图,右上角是最后找到轮廓后采用随机颜色画出来的形态,右下角的是在我们处理过程中通过HSV颜色分割和形态学操作后显示出来的临时图,从右下图中可以看出来,利用颜色分割最左边两个枣完全给分隔开了,不像我们前面那篇里面两个都粘在了一起,需要通过距离变换及连通区域计算进行处理。
随着我们学习的越来越多,在图像处理上就需要采用最优的策略进来行处理,单独写这篇文章,一个是可以回顾一下当时的一些做法,做一个巩固的复习,另一个就是想把新学到的东西看看能不能把以前做过的东西采用最优的方式提取出来,结果自己还是比较满意的,达到了最终的目的。
-END-
Vaccae的往期经典
















