使用opencv2中的calcopticalflowpyrlk跟踪在第一帧(绿点)上拾取的对象的运动流:
我在馈给calcopticalflowpyrlk
的旧点和calcopticalflowpyrlk
输出的那些点之间划了一条线。
用@rotating_image answer引用类似的问题:
您可以测量位移的方向和大小 每个感兴趣的像素都要经过两个连续的帧才能获得 他们的运动方式的想法
实际上,使用被跟踪对象的先前和当前点,我可以找到流向矢量的角度和大小。
但是我仍然看不到它如何帮助我分割图像?
我应该计算所有像素的矢量,而那些先前具有〜“相同”角度和大小的像素是对象,其他所有东西都是背景吗?
还是我错过了什么?
答案 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;
});
其中每种颜色表示一个分段。您可以调整视频的参数
然后基于初始聚类,使用凸包来获得每辆车的适当形状。
这是示例https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html
最后,将运动矢量聚合为最终矢量K,并在船体中心表示最终矢量K。
然后将每个图像的最终矢量K连接起来以形成轨迹。