gpt4 book ai didi

opencv - OpenCV C++ 中跟踪对象的背景减法和光流

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:06 25 4
gpt4 key购买 nike

我正在从事一个项目,使用背景减法检测感兴趣的对象,并在 OpenCV C++ 中使用光流跟踪它们。我能够使用背景减法来检测感兴趣的对象。我能够在单独的程序上实现 OpenCV Lucas Kanade 光流。但是,我被困在如何将这两个程序放在一个程序中。 frame1 保存视频中的实际帧,contours2 是从前景对象中选择的轮廓。

总而言之,如何将通过背景减法方法获得的前景对象提供给 calcOpticalFlowPyrLK?或者,如果我的方法有误,请帮助我。提前谢谢你。

Mat mask = Mat::zeros(fore.rows, fore.cols, CV_8UC1);
drawContours(mask, contours2, -1, Scalar(255), 4, CV_FILLED);

if (first_frame)
{
goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04);
fm0 = mask.clone();
features_prev = features_next;
first_frame = false;
}
else
{
features_next.clear();
if (!features_prev.empty())
{
calcOpticalFlowPyrLK(fm0, mask, features_prev, features_next, featuresFound, err, winSize, 3, termcrit, 0, 0.001);
for (int i = 0; i < features_prev.size(); i++)
line(frame1, features_prev[i], features_next[i], CV_RGB(0, 0, 255), 1, 8);
imshow("final optical", frame1);
waitKey(1);
}
goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04);
features_prev = features_next;
fm0 = mask.clone();
}

最佳答案

您使用光流进行跟踪的方法是错误的。光流方法背后的想法是两个连续图像中的移动点在起点和终点具有相同的像素强度。这意味着通过从起始图像观察其外观并在最终图像中搜索结构来估计特征的运动(非常简单)。

calcOpticalFlowPyrLK 是一个点跟踪器,这意味着以前图像中的点被跟踪到当前图像。因此,这些方法需要系统的原始灰度值图像。因为它只能估计结构化/纹理区域的运动(你需要图像中的 x 和 y 梯度)。

我认为您的代码应该像这样:

  1. 通过背景减法(通过轮廓)提取对象,这在文献中称为 blob
  2. 提取下一张图像中的对象并应用 blob-association(哪个国家属于谁)这也称为 blob-tracken可以使用 calcOpticalFlowPyrLK 进行 Blob 跟踪。例如。以一种非常简单的方式:
  3. 跟踪计数器中的点或 blob 内的点。
  4. 关联:如果属于先前轮廓的点跟踪位于当前轮廓,则先前轮廓是当前轮廓之一

关于opencv - OpenCV C++ 中跟踪对象的背景减法和光流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33118585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com