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

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

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

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

3.)使用findNonZero()定位白色像素,然后计算出行块的总和以及白色像素浓度最高的块及其上方所有行的总和。这样可以去除图像中的打印头,因此ROI仅是其下方的液滴。

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

到目前为止,我已经完成了上述4个步骤。以下是我下一步应该执行的步骤?

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

  • 我也不确定如何给液滴一个ID,因此我可以确定自己已正确跟踪它并知道何时有新液滴进入ROI。

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

    最佳答案

    我认为您的想法很好,可以很容易地扩展到满足您需求的方面。

    为了澄清起见,我将图像中的红色ROI称为“红色ROI”。

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

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

    让我知道您是否不了解这个想法的一部分-我会尽力向您解释。



    我不确定,请检查一下。尝试将CV_RETR_LIST用作findContours的第三个参数,并检查返回的轮廓(由findContours表示)轮廓的第一个点与最后一个点之间的距离-如果距离大于打开的轮廓,否则返回-闭合的轮廓。



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

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

    关于c++ - 使用OpenCV C++检测和跟踪视频中的液滴的步骤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15986107/

    10-10 00:05