千家信息网

C++怎么用OpenCV获取图片中物品的数量

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要讲解了"C++怎么用OpenCV获取图片中物品的数量",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++怎么用OpenCV获取图片中物品的
千家信息网最后更新 2025年02月08日C++怎么用OpenCV获取图片中物品的数量

这篇文章主要讲解了"C++怎么用OpenCV获取图片中物品的数量",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++怎么用OpenCV获取图片中物品的数量"吧!


实现效果

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

实现思路

  • 二值化图像分割

  • 形态学操作(腐蚀+膨胀)

  • 距离变换

  • 连通区域计算

  • 寻找轮廓并计算个数

  • 代码演示

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

    首先加载了图片显示出来




    二值化图像分割

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


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


    再对图像进行二值化操作


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

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




    形态学操作

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


    运行起来看

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


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


    再看一下效果

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




    距离变换

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


    然后开始距离的变换


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


    显示的效果为




    连通区域计算

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


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


    显示效果为

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


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

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




    寻找并计算轮廓

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


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



    运行效果


    再看一下输出的值:

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



感谢各位的阅读,以上就是"C++怎么用OpenCV获取图片中物品的数量"的内容了,经过本文的学习后,相信大家对C++怎么用OpenCV获取图片中物品的数量这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0