使用OpenCV C ++检测和跟踪视频中的液滴的步骤

时间:2013-04-13 09:02:59

标签: c++ opencv tracking measurement

我目前正在进行一项项目,我需要在视频中找到墨滴,在体积估计,速度和行进距离变化之前执行测量。

首先,我想知道我是否正在处理这个项目。目前我有:

1。)将原始图像转换为灰度

2。)应用高斯模糊然后Canny边缘检测(Click here for image

3.)使用findNonZero()定位白色像素,然后计算行块的总和,以及具有最高白色像素浓度的块,并将其上方的所有行裁剪掉。这将删除图像中的打印头,因此ROI仅为其下方的液滴。

4.。)使用findContours查找轮廓。 (Click here for image

以上4个步骤是我迄今为止所做的。以下是我接下来要做的事情吗?

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

我也不确定如何给出一个ID,所以我可以确定我正确地跟踪它并知道新的投放何时进入投资回报率。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

  1. 查找redROI中的所有水滴。记住职位和ID。
  2. 对于上一步中的每个墨滴位置,创建一个类似于黄色矩形的ROI: 对于每个矩形,检查其中是否有液滴 如果是 - 可能是前一帧的液滴,所以你正在寻找的那个 如果不是 - 您可以尝试再次在更大的矩形中搜索,或者假设此ROI的暗点是您的液滴。如果投资回报率接近redROI的底部,则可能是液滴消失了 - 忘了它。
  3. 注意事项:
    - 矩形的大小取决于水滴移动的速度以及它们是否只能垂直或对角移动(风也可以改变移动方向)。
    - 在搜索液滴之前,检查所有矩形是否不相交(没有任何公共区域 - >(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文件开始)