3

我目前正在做一个项目,我需要在视频中定位墨滴,执行诸如体积估计、速度和在它变成球形之前行进的距离等测量。

首先,我想知道我在处理这个项目时是否走在正确的轨道上。目前我有:

1.) 将原图转为灰度图

2.) 应用高斯模糊然后 Canny 边缘检测(单击此处查看图像

3.)定位白色像素,findNonZero()然后计算行块的总和以及白色像素集中度最高的块,并将其上方的所有行都裁剪掉)。这会移除图像中的打印头,因此 ROI 只是其下方的液滴。

4.) 用于findContours查找轮廓。(点击这里查看图片

以上4个步骤是我到目前为止所做的。以下步骤是我接下来应该做的吗?

  • 在裁剪后和寻找轮廓之前先扩张二值图像以确保轮廓将关闭而不是打开?
  • 也许忽略那些非常开放的?(有关如何实际执行此操作的任何提示?)
  • floodFill()每个封闭的圈子
  • 使用以下方法找到每个轮廓的区域contourArea()(然后我可以在这一步之后用一些假设来估计液滴的体积,比如它的形状、像素与体积比等吗?)
  • 找到每个轮廓的中心并将其保存到一个数组中,以便我可以将其与下一帧中同一滴的中心进行比较。一旦我知道液滴中心的行进距离和视频的帧速率,我应该能够估计速度。

我也不确定如何给 drop 一个 ID,以便我可以确定我正在正确跟踪它并知道新的 drop 何时进入 ROI。

任何帮助将不胜感激,谢谢。

4

1 回答 1

2

我认为你的想法很好,可以很容易地扩展到让你满意的东西。

为了澄清起见,我将从您的图像“redROI”中调用红色 ROI。

  1. 查找 redROI 中的所有液滴。记住位置和 ID。
  2. 对于上一步中的每个液滴位置,创建一个类似于黄色矩形的 ROI: 对于每个矩形,检查其中是否有液滴。
    如果是 - 可能是前一帧中的液滴,所以是您正在寻找的液滴。
    如果不是 - 您可以尝试在更大一点的矩形中再次搜索,或者假设该 ROI 的暗点是您的液滴。如果 ROI 接近 redROI 的底部,则液滴可能已经消失 - 忘了它。

注意几件事:
矩形的大小取决于水滴移动的速度以及它们是否只能垂直或对角线移动(风也可以改变移动方向)。
- 在搜索液滴之前,检查所有矩形是否不相交(每对矩形没有任何公共区域 -> (Rect1 & Rect2).area() == 0)。
- 在 ROI 中搜索液滴之前,请确保该 ROI 在 redROI 内。所以只需使用以下代码:roi = roi & redROI;
找到每个旧水滴的新位置后,在整个 redROI 中搜索水滴,这样您就不会错过任何新水滴。

如果您不理解这个想法的某些部分,请告诉我 - 我会尝试更好地解释它。

也许忽略那些非常开放的?(有关如何实际执行此操作的任何提示?)

我不确定,所以检查一下。尝试将其CV_RETR_LIST用作第三个参数findContours并检查返回的(按findContours)轮廓的第一个点和最后一个点之间的距离 - 如果距离大于轮廓是打开的,如果不是 - 它是关闭的。

floodFill() 每个封闭的圈子

您可以使用drawContours并将thickness参数设置为-1- 更简单和更快的解决方案。


编辑:
您也可以尝试使用光流 - 它已经在 openCV 中实现,在这里您可以阅读关于此的精彩教程:http ://robotics.stanford.edu/~dstavens/cs223b/ (从 .pdf 文件开始)

于 2013-04-13T23:12:03.187 回答