如何在opencv中使用光流跟踪来分割图像?

时间:2019-05-22 12:54:54

标签: python opencv image-processing computer-vision image-segmentation

使用opencv2中的calcopticalflowpyrlk跟踪在第一帧(绿点)上拾取的对象的运动流:

enter image description here

我在馈给calcopticalflowpyrlk的旧点和calcopticalflowpyrlk输出的那些点之间划了一条线。

最后我得到了很好的跟踪 enter image description here


用@rotating_image answer引用类似的问题:

  

您可以测量位移的方向和大小   每个感兴趣的像素都要经过两个连续的帧才能获得   他们的运动方式的想法


实际上,使用被跟踪对象的先前和当前点,我可以找到流向矢量的角度和大小。

但是我仍然看不到它如何帮助我分割图像?

我应该计算所有像素的矢量,而那些先前具有〜“相同”角度和大小的像素是对象,其他所有东西都是背景吗?

还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

假设您具有流图像,并且想要自动跟踪流向同一方向的斑点。

所以您得到的是稀疏流,它看起来像下面的某物

您可以为此使用opencv分区。分区就像基于距离的聚类算法,它比kmean更好,因为您不必输入数字k。问题在于它容易受到噪音和虚假关联的影响。因此,我更喜欢在大于阈值的流向量集上使用它。

您可以在下面找到一个示例

int th_distance = 18; // radius tolerance

int th2 = th_distance * th_distance; // squared radius tolerance
vector<int> labels;

int n_labels = partition(pts, labels, [th2](const Point& lhs, const Point& rhs) {
    return ((lhs.x - rhs.x)*(lhs.x - rhs.x) + (lhs.y - rhs.y)*(lhs.y - rhs.y)) < th2; 
});

enter image description here-> enter image description here

其中每种颜色表示一个分段。您可以调整视频的参数

然后基于初始聚类,使用凸包来获得每辆车的适当形状。

这是示例https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html

enter image description here enter image description here

最后,将运动矢量聚合为最终矢量K,并在船体中心表示最终矢量K。

然后将每个图像的最终矢量K连接起来以形成轨迹。