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

OpenCV C+中用于跟踪目标的背景减法和光流+; 我正在使用背景减法来检测感兴趣的物体,并用OpenCV C++中的光流跟踪它们。我能够通过背景减法检测出感兴趣的物体。我能够在单独的程序上实现OpenCV Lucas Kanade光流。但是,我被困在如何将这两个程序放在一个程序中frame1保存视频中的实际帧,contours2是从前景对象中选择的轮廓,opencv,opticalflow,background-subtraction,Opencv,Opticalflow,Background Subtraction,总而言之,如何将通过背景减法获得的上述对象馈送到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, f

总而言之,如何将通过背景减法获得的上述对象馈送到
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();         
    }
Mat mask=Mat::零(fore.rows、fore.cols、CV_8UC1);
绘制轮廓(掩模,轮廓2,-1,标量(255),4,CV_填充);
if(第一帧)
{
良好特性跟踪(掩码,特性_next,1000,0.01,10,noArray(),3,false,0.04);
fm0=mask.clone();
特征\上一个=特征\下一个;
第一帧=假;
}
其他的
{           
特性_next.clear();
如果(!features_prev.empty())
{
calcOpticalFlowPyrLK(fm0,掩码,特征上一个,特征下一个,特征查找,错误,winSize,3,termcrit,0,0.001);
对于(int i=0;i
我认为OpenCV中的背景减法输出不是灰度图像。对于输入光流,我们需要灰度图像。

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

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

我认为您的代码应该执行以下操作:

  • 通过背景减法(通过轮廓)提取对象这在文献中称为blob
  • 提取下一幅图像中的对象并应用blob关联(哪个计数属于谁),这也称为blob tracken 可以使用CalCopticalFlowPyrk进行水滴跟踪。例如,以一种非常简单的方式:
  • 从计数点或blob内的点跟踪点
  • 关联:如果属于前一轮廓的点轨迹位于当前计数,则前一轮廓是当前轮廓之一