2012-06-23 5 views
4

Я реализовал оптический поток для отслеживания транспортных средств на дороге, и это оказалось очень медленным.opencv- отслеживание транспортного средства с использованием оптического потока

мой код использует функции:

  • cvGoodFeaturesToTrack
  • cvFindCornerSubPix
  • cvCalcOpticalFlowPyrLK

Как мне сделать это отслеживать быстро и эффективно?

Мой код:

#include "highgui.h" 
#include "cv.h" 
#include "cxcore.h" 
#include <iostream> 
using namespace std; 


const int MAX_CORNERS = 500; 

int main() 
{ 
CvCapture* capture=cvCreateFileCapture("E:\cam1.avi"); 
IplImage* img_A;// = cvLoadImage("image0.png", CV_LOAD_IMAGE_GRAYSCALE); 
IplImage* img_B;// = cvLoadImage("image1.png", CV_LOAD_IMAGE_GRAYSCALE); 
img_A=cvQueryFrame(capture); 

IplImage* imgA = cvCreateImage(cvGetSize(img_A), 8, 1); 
IplImage* imgB = cvCreateImage(cvGetSize(img_A), 8, 1); 
cvNamedWindow("ImageA", CV_WINDOW_AUTOSIZE); 
cvNamedWindow("ImageB", CV_WINDOW_AUTOSIZE); 
cvNamedWindow("LKpyr_OpticalFlow", CV_WINDOW_AUTOSIZE); 

while(1) 
{ 
    int couter=0; 
    for(int k=0;k<20;k++) 
    { 
     img_B=cvQueryFrame(capture); 
    } 


    //cvCvtColor(imgA,imgA,CV_BGR2GRAY); 
    //cvCvtColor(imgB,imgB,CV_BGR2GRAY); 
    // Load two images and allocate other structures 
    /*IplImage* imgA = cvLoadImage("image0.png", CV_LOAD_IMAGE_GRAYSCALE); 
    IplImage* imgB = cvLoadImage("image1.png", CV_LOAD_IMAGE_GRAYSCALE);*/ 

    CvSize img_sz = cvGetSize(img_A); 
    int win_size = 10; 



    IplImage* imgC = cvCreateImage(cvGetSize(img_A), 8, 1); 
    cvZero(imgC); 
    // Get the features for tracking 
    IplImage* eig_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); 
    IplImage* tmp_image = cvCreateImage(img_sz, IPL_DEPTH_32F, 1); 

    int corner_count = MAX_CORNERS; 

    CvPoint2D32f* cornersA = new CvPoint2D32f[ MAX_CORNERS ]; 


    cvCvtColor(img_A,imgA,CV_BGR2GRAY); 

    cvCvtColor(img_B,imgB,CV_BGR2GRAY); 


    cvGoodFeaturesToTrack(imgA, eig_image, tmp_image, cornersA, &corner_count ,0.05, 5.0, 0, 3, 0, 0.04); 

    cvFindCornerSubPix(imgA, cornersA, corner_count, cvSize(win_size, win_size) ,cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03)); 

    // Call Lucas Kanade algorithm 
    char features_found[ MAX_CORNERS ]; 
    float feature_errors[ MAX_CORNERS ]; 

    CvSize pyr_sz = cvSize(imgA->width+8, imgB->height/3); 

    IplImage* pyrA = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); 
    IplImage* pyrB = cvCreateImage(pyr_sz, IPL_DEPTH_32F, 1); 

    CvPoint2D32f* cornersB = new CvPoint2D32f[ MAX_CORNERS ]; 

    /*int jk=0; 
    for(int i=0;i<imgA->width;i+=10) 
    { 
     for(int j=0;j<imgA->height;j+=10) 
     { 
      cornersA[jk].x=i; 
      cornersA[jk].y=j; 
      ++jk; 
     } 
    } 
    */ 
    cvCalcOpticalFlowPyrLK(imgA, imgB, pyrA, pyrB, cornersA, cornersB, corner_count, 
     cvSize(win_size, win_size), 5, features_found, feature_errors, 
     cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.3), 0); 

    // Make an image of the results 


    for(int i=0; i < corner_count; i++) 
    { 
     if(features_found[i]==0|| feature_errors[i]>550) 
     { 
      //printf("Error is %f/n",feature_errors[i]); 
      continue; 
     } 
     //printf("Got it/n"); 
     CvPoint p0 = cvPoint(cvRound(cornersA[i].x), cvRound(cornersA[i].y)); 
     CvPoint p1 = cvPoint(cvRound(cornersB[i].x), cvRound(cornersB[i].y)); 
     cvLine(imgC, p0, p1, CV_RGB(255,0,0), 2); 
     cout<<p0.x<<" "<<p0.y<<endl; 
    } 




    cvShowImage("LKpyr_OpticalFlow", imgC); 
    cvShowImage("ImageA", imgA); 
    cvShowImage("ImageB", imgB); 
    //cvCopyImage(imgB,imgA); 
    delete[] cornersA; 
    delete[] cornersB; 
    cvWaitKey(33); 
} 


return 0; 
} 
+1

Лучше переместить его: http://codereview.stackexchange.com/ – karlphillip

ответ

11

Возможно, я немного перейду через эту линию, но я предлагаю вам ознакомиться с OpenTLD. OpenTLD (aka Predator) является одним из наиболее эффективных алгоритмов отслеживания. Zdenek Kalal внедрил OpenTLD в MATLAB. Джордж Небехай сделал очень эффективный C++ OpenCV port of OpenTLD.

Очень прост в установке и отслеживании, действительно эффективен.

OpenTLD использует Median Flow Tracker для отслеживания и реализации алгоритма обучения PN. В этом YouTube Video Зденек Калал показывает использование OpenTLD.

Если вы просто хотите реализовать Median Flow Tracker, перейдите по этой ссылке https://github.com/gnebehay/OpenTLD/tree/master/src/mftracker

Если вы хотите использовать его в Python, я сделал Median Flow Tracker, а также сделал Python port of OpenTLD. Но порт python не очень эффективен.

5

Прежде всего, чтобы отслеживать автомобиль, вы должны как-то обнаружить его (используя цветовую сегментацию/вычитание фона, например). Когда автомобиль обнаружен, вы должны отслеживать его (отслеживать некоторые точки на нем), используя cvCalcOpticalFlowPyrLK. Я не нашел код, отвечающий за обнаружение автомобиля.

Взгляните на статьи this и this. Ваша идея должна быть одинаковой.

Также ваш код немного ошибочен. Например, почему вы вызываете cvGoodFeaturesToTrack в основной цикл? Вы должны вызвать его один раз - перед циклом, чтобы обнаружить хорошие функции для отслеживания. Но это также обнаружит не-автомобили.

Взгляните на пример по умолчанию OpenCV: OpenCV/samples/cpp/lkdemo.cpp.

+0

я уже сделал bakground вычитание, обнаружение я только ушел с этой трекинга части, которая является своего рода очень медленно –

+0

@SumitKumarSaha это медленно, потому что вы вызовите 'cvGoodFeaturesToTrack' в цикле вместо того, чтобы вызывать его раньше. См. Пример. – ArtemStorozhuk

Смежные вопросы