我正在开发一个项目,使用背景减法检测感兴趣的对象,并使用OpenCV C中的光流跟踪它们.我能够使用背景减法检测感兴趣的对象.我能够在单独的程序上实现OpenCV Lucas Kanade光流.但是,我坚持如何在一个程序中使用这两个程序. frame1保存视频中的实际帧,contours2是前景对象的选定轮廓.
总而言之,如何将从Background减法方法获得的forground对象提供给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();
}
最佳答案 您使用光流进行跟踪的方法是错误的.光流方法背后的想法是两个连续图像中的移动点在开始和端点处具有相同的像素强度.这意味着通过从起始图像观察其外观并在最终图像中搜索结构(非常简化)来估计feautre的运动.
calcOpticalFlowPyrLK是一个点跟踪器,表示先前图像中的点跟踪到当前图像.因此,这些方法需要系统的原始灰度值图像.因为它只能估计结构化/纹理区域上的运动(图像中需要x和y渐变).
我认为你的代码应该做一些事情:
>通过背景减法(按轮廓)提取对象,这在文献中称为blob
>在下一个图像中提取对象并应用blob-assoziation(它们属于谁)这也称为blob-tracken
可以使用calcOpticalFlowPyrLK进行blob跟踪.例如.以一种非常简单的方式:
>跟踪点数或点数内的点数.
> Assoziation:前一个轮廓是当前的轮廓之一,属于前一个轮廓的点跟踪位于当前的轮廓