Отслеживание многоцелевого объекта с использованием Optical Flow PyrLK по результатам обнаружения haar
Я пытаюсь отследить несколько объектов (автомобилей) в видеороликах с помощью Optical Flow PyrLK по результатам обнаружения haar, но проблема в том, что обнаружение haar (объекта) не появляется в кадрах! Как я могу отследить объект, который обнаружение haar (объект) не появляется в нескольких кадрах?? как я могу приблизить это место автоматически,,,
Я пытаюсь найти объект, используя Оптический поток PyrLK ... но эта техника потеряна, когда обнаружение haar (объект) не появляется
Любые предложения идеи??? пожалуйста.....
Green Rect = результат обнаружения Haar, Red Point = углы от 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 ответ
Если вы используете обнаружение Хаара для каждого кадра, почему вы используете отслеживание LK?
При отслеживании объектов, поскольку обнаружение Хаара очень тяжелое и медленное, люди обычно применяют обнаружение Хаара в первом кадре и отслеживают объект, используя другие методы.
В вашем случае использование CamShift, кажется, делает эту работу. Итак, вы делаете обнаружение Хаара в первом кадре и позволяете CamShift отслеживать автомобили.
Обратите внимание, что алгоритм CamShift полностью основан на гистограмме изображения, поэтому в случаях, когда цвет объекта значительно отличается от фона, он работает хорошо.