use*_*028 5 opencv opticalflow background-subtraction
我正在开发一个项目,使用背景扣除来检测感兴趣的对象,并使用 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();
}
Run Code Online (Sandbox Code Playgroud)
您使用光流进行跟踪的方法是错误的。光流方法背后的想法是两个连续图像中的移动点在起点和终点具有相同的像素强度。这意味着特征的运动是通过观察起始图像中的外观并搜索最终图像中的结构来估计的(非常简化)。
calcOpticalFlowPyrLK 是一个点跟踪器,这意味着先前图像中的点将被跟踪到当前图像。因此,这些方法需要系统的原始灰度值图像。因为它只能估计结构化/纹理区域上的运动(您需要图像中的 x 和 y 梯度)。
我认为你的代码应该做一些类似的事情:
| 归档时间: |
|
| 查看次数: |
4130 次 |
| 最近记录: |