我目前正在做一个项目,需要在视频中找到墨滴,进行诸如体积估计,速度和在球变成球形之前的行进距离之类的测量。
首先,我想知道我在处理这个项目方面是否走正确的道路。目前,我有:
1.)将原始图像转换为灰度
2.)应用高斯模糊然后进行Canny边缘检测(Click here for image)
3.)使用findNonZero()
定位白色像素,然后计算出行块的总和以及白色像素浓度最高的块及其上方所有行的总和。这样可以去除图像中的打印头,因此ROI仅是其下方的液滴。
4.)使用findContours
查找轮廓。 (Click here for image)
到目前为止,我已经完成了上述4个步骤。以下是我下一步应该执行的步骤?
floodFill()
每个封闭的圈子contourArea()
查找每个轮廓的区域(在此步骤之后,我能否在其形状,像素与体积之比等一些假设的前提下估算液滴的体积?)我也不确定如何给液滴一个ID,因此我可以确定自己已正确跟踪它并知道何时有新液滴进入ROI。
任何帮助将不胜感激,谢谢。
最佳答案
我认为您的想法很好,可以很容易地扩展到满足您需求的方面。
为了澄清起见,我将图像中的红色ROI称为“红色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/