从 haar 检测结果中使用光流 PyrLK 跟踪多个对象
Posted
技术标签:
【中文标题】从 haar 检测结果中使用光流 PyrLK 跟踪多个对象【英文标题】:Tracking multipel opject using Optical Flow PyrLK from haar detection result 【发布时间】:2017-01-03 05:33:05 【问题描述】:我正在尝试使用来自 haar 检测结果的光流 PyrLK 跟踪视频中的多个对象(汽车),但问题是有时 haar 检测(对象)不会出现在帧中! 如何跟踪 haar 检测(对象)未出现在几帧中的对象?我怎样才能近似它是自动放置的,,,
我正在尝试使用光流 PyrLK 查找对象...但是当 haar 检测(对象)未出现时,此技术会丢失
有什么建议吗???请……
绿色矩形 = Haar 检测结果,红色点 = GoodFeaturestoTrack 的角
这是我的代码: 你能给我解决办法吗??
video >> prev_frame;
Rect roi = Rect(50, 180, 540, 240);
prevROI=prev_frame(roi);
cvtColor(prevROI, gray, CV_BGR2GRAY);
gray.convertTo(prev_img, CV_8UC1);
while(true)
video >> frameROI;
Rect roi = Rect(50, 180, 540, 240);
Mat ROI=frameROI(roi);
cvtColor(ROI, gray, CV_BGR2GRAY); //=====> RGB to Grayscale
gray.convertTo(imgROI, CV_8UC1);
vector<Rect> cars;
Casmobil.detectMultiScale(gray, cars, 1.1, 3,
CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,
Size(0,0));
for (size_t i = 0; i < cars.size(); i++)
Rect square = cars[i];
areax = (cars[i].x + cars[i].width*0.5);
areay = (cars[i].y + cars[i].height*0.5);
Point cen_point = Point(areax ,areay);
rectangle(ROI, square,CV_RGB(0,255,0),2,8,0);
circle(ROI, cen_point, 3,CV_RGB(255, 0, 0),-2);
for (int i = 0; i < cars.size(); i++)
Rect square2 = cars[i];
cropcars = imgROI(square2);
ROIOF = ROI(square);
//prev_frame
goodFeaturesToTrack(cropmobil, prevframe_corners,maxCorners,
qualityLevel,minDistance,Mat(),
blockSize,useHarrisDetector,k);
calcOpticalFlowPyrLK(prev_img, imgROI, prevframe_corners,
frame_corners, found, error,
Size(win_size, win_size), maxlevel,termcrit);
Rect box = boundingRect(frame_corners);
rectangle(ROIOF, box, CV_RGB(0,255,255),2,8,0);
Boxx = (box.x + box.width*0.5);
boxy = (box.y + box.height*0.5);
cen = Point(boxx, boxy);
circle(ROIF, cen, 3, CV_RGB(0, 0, 255), -1);
for( int j = 0; j < frame_corners.size(); j++ )
circle(ROIOF, frame_corners[j], 2, CV_RGB(255, 0, 0), -1);
circle(ROIOF, prevframe_corners[j], 2, CV_RGB(0, 0, 255), -1);
line(ROIOF,frame_corners[j], cen, CV_RGB(0, 255, 0),2, 8, 0);
prev_img = imgROI.clone();
【问题讨论】:
【参考方案1】:如果您对每个帧都使用 Haar 检测,那么为什么要使用 LK 跟踪?
在目标跟踪中,由于 Haar 检测权重很大且速度慢,人们通常在第一帧中应用 Haar 检测,并使用其他方法跟踪目标。
在您的情况下,使用 CamShift 似乎可以完成这项工作。因此,您在第一帧中进行 Haar 检测并让 CamShift 跟踪汽车。
请注意,CamShift 算法完全基于图像直方图,因此在物体颜色与其背景有很大差异的情况下,它可以正常工作。
【讨论】:
在这种情况下,如果我仍在使用光流 LK 进行跟踪。我必须在第一帧中应用 Haar 检测并使用光流跟踪对象??/ @Cong_Cong 是的。因此,您首先进行 Haar 检测以找到您的对象在哪里,然后找到其好的特征(goodFeaturesToTrack
),最后让 LKT 跟踪特征点。此外,为了提高准确性,您可以每隔几帧进行一次 Haar 检测。
在我上面做的代码中,我在每一帧的每个haar上实现了光流PyrLK,但问题是当帧上没有检测到haar的存在时,光流是也不在那里。这个问题可能有解决办法吗?
@Cong_Cong 如果您的意图是跟踪汽车,那么为什么要检测它们(使用 Haar 分类)?据我所知,人们首先检测一个对象,然后跟踪它。 Haar 用于检测,KLT 用于跟踪。如您所知,KLT 需要两个点列表,一个用于当前帧,另一个用于前一帧。因此,您应该先检测,然后找到它的好的特征并将它们提供给KLT 以跟踪这些特征。另外值得一提的是,在 KLT 期间可能会丢失一些积分。在这种情况下,您应该重新检测和重新发现好的特征并再次进行KLT。听起来很清楚?
@Cong_Cong 但是在我看来,在这种情况下,可能值得看看 CamShift。 OpenCV 有一个与您完全相同的示例,跟踪汽车。以上是关于从 haar 检测结果中使用光流 PyrLK 跟踪多个对象的主要内容,如果未能解决你的问题,请参考以下文章