我目前正在进行一项项目,我需要在视频中找到墨滴,在体积估计,速度和行进距离变化之前执行测量。
首先,我想知道我是否正在处理这个项目。目前我有:
1。)将原始图像转换为灰度
2。)应用高斯模糊然后Canny边缘检测(Click here for image)
3.)使用findNonZero()
定位白色像素,然后计算行块的总和,以及具有最高白色像素浓度的块,并将其上方的所有行裁剪掉。这将删除图像中的打印头,因此ROI仅为其下方的液滴。
4.。)使用findContours
查找轮廓。 (Click here for image)
以上4个步骤是我迄今为止所做的。以下是我接下来要做的事情吗?
floodFill()
每个封闭的圈子contourArea()
查找每个轮廓的区域(我可以通过一些假设,比如它的形状,像素与体积比等来估算此步骤后的下降量吗?)我也不确定如何给出一个ID,所以我可以确定我正确地跟踪它并知道新的投放何时进入投资回报率。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
我认为你的想法很好,可以很容易地扩展到能满足你的东西。
为了澄清,我将从您的图像“redROI”中调用红色ROI。
注意事项:
- 矩形的大小取决于水滴移动的速度以及它们是否只能垂直或对角移动(风也可以改变移动方向)。
- 在搜索液滴之前,检查所有矩形是否不相交(没有任何公共区域 - >(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文件开始)