使用 calcOpticalFlowPyrLK 跟踪多个对象
Posted
技术标签:
【中文标题】使用 calcOpticalFlowPyrLK 跟踪多个对象【英文标题】:tracking multiple objects using calcOpticalFlowPyrLK 【发布时间】:2015-09-28 14:23:21 【问题描述】:下面的 sn-p 代码用于跟踪,但问题是我不知道为什么由于某些原因点(对象的质心点)在几帧并行消失 calcOpticalFlowPyrLK 也不适用于这些帧一切都消失了几帧。图像如下所示。任何人都可以请帮助持续跟踪这些对象。我也尝试过使用卡尔曼滤波器,但没有成功。
视频的第 10 帧
视频的第 25 帧
看这个图像点消失了,只是显示了一个输入图像
视频的第 45 帧
for(int i =0; i<theVehicles.size(); i++)
Point p=Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos());
points12.push_back(p);
TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS,20,0.03);
Size subPixWinSize(10,10), winSize(31,31);
//cout<<p;
calcOpticalFlowPyrLK(prevGray, filledEdgesOut, points12,points, status, err, winSize, 3, termcrit, 0, 0.001);
RNG rng(12345);
for( int i = 0; i < points.size(); i++ )
circle( frame, points[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255),rng.uniform(0,255)), -1, 8, 0 );
/*cv::circle(frame,points[i],10,cv::Scalar(0,0,255));
cv::putText(frame,intToString(theVehicles.at(i).getXPos())+ " , " + intToString(theVehicles.at(i).getYPos()),cv::Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos()+20),1,1,Scalar(0,255,0));
cv::putText(frame,theVehicles.at(i).getType(),cv::Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos()-30),1,2,theVehicles.at(i).getColour());*/
【问题讨论】:
@Miki 你能看看这个问题,我能解决吗?? 【参考方案1】:如果您在循环中执行此操作(例如,对于每一帧),则必须在正确检测和跟踪对象后重新生成对象上的点。例如,如果您使用边界框来描述您的车辆,那么一旦您在两个连续帧之间匹配车辆,您必须通过使用 good features 或统一在新的检测到车辆。
【讨论】:
我已经做了任何一种方式先生..!!但问题仍然存在。看上面问题的第一张图像和最后一张图像,中间的两辆车是分开检测的,但在第三张图像中,它们都合并形成单个物体。未跟踪点。而且结果也不可靠,就像上面的第二张图片没有显示一样。以上是关于使用 calcOpticalFlowPyrLK 跟踪多个对象的主要内容,如果未能解决你的问题,请参考以下文章
Opencv 2.4.12_2 calcOpticalFlowPyrLK() 错误
calcOpticalFlowPyrLK 在高 FPS 下性能更差
openCV 2.4.2 上的 calcOpticalFlowPyrLK
来自 calcOpticalFlowPyrLK 的“标准”epsilon 和 maxCount 是啥
Android - OpticalFlow:calcOpticalFlowPyrLK & goodFeaturesToTrack 返回相同的点