我正在编写一个代码,我必须找到我感兴趣的所有角点的轨迹。所以,同样,我使用了LKPyr光流,它使用前一个图像的角点并找到它们在当前图像中。我逐帧使用光流,即帧1和2,然后是2和3.所以,我认为我在前一次迭代中发现的第2帧角特征将是光流的当前特征,但是事实并非如此,每当我做好跟踪功能时,点数会发生变化,问题是,对于轨迹点,我需要跟踪当前点并在它们到来时添加新点,当旧点即将丢失时,我应该得到状态= 0,以便我可以逐个跟踪点。有办法吗?有没有办法知道每个点何时在视频中结束,以便我可以跟踪轨迹?将cvLKpyrOpticalFlow调用中的标志更改有助于获得连续流吗?
cvGoodFeaturesToTrack ( imgGrayscale, imgEigen, imgTemp, corners_img, &corner_count, 0.01, 5.0, 0, 3, 0.4 );
cvCalcOpticalFlowPyrLK( imgGrayscale, nxtimgGrayscale, pyr_img, pyr_nxtimg, corners_img, corners_nxtimg, corner_count, cvSize ( win_size, win_size ), 5, status, track_error, IterCriteria, NULL);
这是我为了获得光流而运行的代码块。
答案 0 :(得分:2)
您应该仅在您正在跟踪的序列的“第一个”(或“参考”)帧中运行cvGoodFeturesToTrack,然后仅在后续帧中运行cvCalcOpticalFlowPyrLK。
前一个例程在参考帧中识别具有“高对比度”(在明确定义的表达式中)的像素和块,因此可能更容易跟踪。后一个例程实际上进行跟踪,将参考特征与后续帧中的附近位置相匹配,以便识别它们的新位置。当它成功时,它将状态向量中的相应元素设置为1.后续帧中的这些特征可能是或可能不是帧本身的“跟踪的好特征”,因为可能存在具有更高对比度的其他图像区域。无论如何,对于大多数应用程序,您只想跟踪参考框架中检测到的“良好特征”。
由于某些功能的跟踪通常会失败,因此在几帧后您可能会发现没有(或没有足够的)“实时”跟踪功能。此时,您可以再次运行“良好特征”检测以补充该集合。