使用opencv的光流

Optical flow using opencv

本文关键字:光流 opencv 使用      更新时间:2023-10-16

我正在使用OpenCV的Pyramid Lukas Kanade函数来估计光流。 我打电话给cvGoodFeaturesToTrack,然后cvCalcOpticalFlowPyrLK.这是我的代码:

while(1)
{
...
cvGoodFeaturesToTrack(frameAth,eig_image,tmp_image,cornersA,&corner_count,0.01,5,NULL,3,0.4);
std::cout<<"CORNER COUNT AFTER GOOD FEATURES2TRACK CALL = "<<corner_count<<std::endl;
cvCalcOpticalFlowPyrLK(frameAth,frameBth,pyrA,pyrB,cornersA,cornersB,corner_count,cvSize(win_size,win_size),5,features_found,features_errors,cvTermCriteria( CV_TERMCRIT_ITER| CV_TERMCRIT_EPS,20,0.3 ),CV_LKFLOW_PYR_A_READY|CV_LKFLOW_PYR_B_READY);
cvCopy(frameBth,frameAth,0);
...
}

frameAth是上一个灰帧,frameBth是网络摄像头的当前灰帧。但是当我输出每帧中要跟踪的良好特征的数量时,该数字在总和时间后减少并不断减少。但是,如果我终止程序并再次执行代码(在不干扰网络摄像头视野的情况下),则更多点将显示为跟踪的良好功能......对于相同的视野和相同的场景,该功能怎么能给出如此多的点数差异......而且差异很大..例如。执行 4 分钟后要跟踪的良好特征的点数是 20 或 50 个......但是当同一个程序终止并再次执行时,初始数字为 500 到 700,但再次缓慢减少。在过去的4个月里,我一直在使用OpenCV,所以我是OpenCV的新手。请指导我或告诉我在哪里可以找到解决方案...提前感谢很多..

您必须

调用cvGoodFeaturesToTrack一次(在开始时,循环之前)来检测要跟踪的良好特征,然后使用cvCalcOpticalFlowPyrLK跟踪这些特征。看看默认的opencv示例:OpenCV/samples/cpp/lkdemo.cpp

您正在调用cvGoodFeatureToTrack并通过引用传递corner_count。如果找到的要素较少,则其值会减小。在 while 循环的每次迭代中调用 cvGoodFeaturesToTrack 之前,必须将 corner_count 的值重置为其初始值。