c++ - Blob 跟踪算法

标签 c++ opencv computer-vision tracking

我正在尝试使用 OpenCV 创建简单的 blob 跟踪。我已经使用 findcontours 检测到 Blob 。我想给这些 blob 一个固定的 ID。

我收集了前一帧和当前帧的 Blob 列表。然后我计算了前一帧和当前帧中每个 Blob 之间的距离。我想知道跟踪 blob 并给它们一个 ID 还需要什么。我只是计算了之前和当前帧 blob 之间的距离,但如何使用测量到的 blob 之间的距离为 blob 分配一致的 ID?

最佳答案

在第一帧中,您可以任意分配 id,第一个为 1,第二个为 2...或者只是根据它们在集合中的位置为其分配 ID。

然后在下一帧你将不得不使用最佳匹配。查找 Blob ,计算当前 Blob 与前一图像的所有 Blob 之间的所有距离,并将每个先前的 ID 分配给最近的 Blob 。刚进入该字段的 Blob 将获得新的 ID。

现在你有两帧,你可以为下一帧做运动预测。只需计算 blob 的先前位置和当前位置之间的 deltaX 和 deltaY。您可以使用此信息来猜测 future 的位置。匹配这个 future 的位置。

如果您没有太多重叠的 Blob ,并且每帧之间的移动不是太快和不稳定,这应该可行。

通过多张图片使用评分系统可能会更准确:
获取前 3 或 5 张图像的位置。对于第一帧的任何 Blob ,在第二帧上寻找最近​​的 Blob ,计算速度(deltaX deltaY),寻找最接近帧 3、4、5 的预测位置...总结预测位置和最近 Blob 之间的所有距离是分数。使用第 2 帧上的第二个最近的对象执行相同操作(它将朝另一个方向寻找)。分数越低,最有可能是好 Blob 。

如果你有很多 Blob ,你应该使用四叉树来加速处理。比较平方距离;它将避免大量的 sqrt 计算。

重要的是要了解您的 Blob 通常如何移动以调整您的算法。

关于c++ - Blob 跟踪算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12330745/

相关文章:

c++ - 在代码中创建工具箱对象(例如标签等)

c++ - 从Pytorch C++中的c10::Dict <c10::IValue,c10::IValue>获取值

opencv - 在opencv中读取检测到的圆圈中像素的HSV值

python - 如何使用 Python OpenCV 定义阈值以仅检测图像中的绿色对象?

algorithm - 检测给定图片是否为人脸的方法是什么?

在图像/帧序列中查找差异/相似性的算法

C++字符串大小减去整数不是期望值,为什么?

c++ - 体系结构 x86_64 : for caffe build 的 undefined symbol

opencv - 基于密度的图像-Opencv 热图

C++:埃拉托色尼筛法并不总是有效