计算二值图像中的前景对象

Posted

技术标签:

【中文标题】计算二值图像中的前景对象【英文标题】:Counting foreground objects in a binary image 【发布时间】:2012-11-10 01:03:28 【问题描述】:

我有一个图像序列(视频)。我想计算图像序列中的对象数量。但主要目标是将它们计数一次,这意味着不仅仅是在每一帧中,因为一个对象可能存在于几个帧中。我的想法是在物体退出屏幕时对它们进行计数,因为遮挡较少。我正在考虑通过扫描图像底部的非零像素来做到这一点。

我有一个 CV_FILLED 二进制图像(来自矩形函数),我想在其中进行扫描,然后在找到 abject 时在对象上创建一个实例。但是这种扫描不会扫描水平线上的每一个像素,只是扫描某些部分。

就像我们可以在范围内进行,比如某些列,然后跳过一个边距。

附上我的二进制图像示例。这是从提要中获得的图像。我不想只计算这张图片中的物体,还要计算那些仍在到来的物体。

此处附上检测到的对象的全图。欢迎您的指导或建设性批评 * 我不想使用 CVBlob

【问题讨论】:

*注意 - CVBlobLib 是不允许的:那是什么原因?在家工作 ?重复使用其他人的工作通常是一个好主意;特别是如果他们做你想要达到的目标 但我更感兴趣的是如何将 blob 从第 i 帧关联到第 i+1 帧?这样我们就不必多次检测同一帧... 然后呢?您可以使用 cvBlobLib 逐帧检测 blob。重要的是你之后用它做什么。 【参考方案1】:

如果您不想使用 cvBlobLib,您可以使用 OpenCV 中的轮廓检测。

有教程on the website.

该方法的文档是here。您的图像看起来很简单,但是如果您得到带有遮挡的斑点,因此您想查看 CV_RETR_EXTERNAL 常量以仅获取外部轮廓。

这是我通常使用的,尽管它需要更多的工作才能使用该方法的结果。

希望这会有所帮助。

【讨论】:

【参考方案2】:

如果方块在底部不重叠,我建议如下:

扫描图像的最底行并识别那些连接的白色像素。每条白线将对应一个正方形。保存白线段的中心及其长度。在下一帧中,执行相同操作并将相应的线段与前一帧相关联(长度相同且中心非常接近)。当您再也找不到相应的线段时,正方形已移出图像,这意味着您可以将正方形计数器增加一。请注意,线条左右两端的线段的长度会随着每一帧而递减。

【讨论】:

【参考方案3】:

谢谢各位。我已经设法解决了这个问题。我沿着正方形的路径使用了小的 ROI,并在 ROI 中找到了countNonZero()

我不断检查boolean 变量,以查看 ROI 是否仍有白色像素。如果不是,则递增计数器。工作得很好,我能够数数。

感谢您的意见...

【讨论】:

以上是关于计算二值图像中的前景对象的主要内容,如果未能解决你的问题,请参考以下文章

转-二值图像连通域标记

图像二值化处理Java

opencv4图像分割那些你不知道的API 代码可直接移植使用

图像细化函数(背景为黑色像素值为0,前景为白色像素值255,必须只含有0和255的像素值,即二值化后的图像)

图形验证码识别——图像预处理:二值化

如何用matlab计算二值化图中白色区域的像素点个数