opencv - suivi de véhicule à l'aide de flux optique
J'ai mis en œuvre un flux optique pour suivre les véhicules sur la route et il s'est avéré être très lent.
mon code utilise les fonctions:
- cvGoodFeaturesToTrack
- cvFindCornerSubPix
- cvCalcOpticalFlowPyrLK
Comment puis-je faire de ce suivi rapide et efficace?
Mon code est:
#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;
}
Mieux se déplacer à: codereview.stackexchange.com
OriginalL'auteur Sumit Kumar Saha | 2012-06-23
Vous devez vous connecter pour publier un commentaire.
J'ai peut-être aller un peu au-dessus de la ligne ici, mais je vous suggère de vérifier
OpenTLD
. OpenTLD (aka Prédateur) est l'un des plus efficaces de l'algorithme de suivi. Zdenek Kalal a mis en œuvre OpenTLD dans MATLAB. George Nebehay a fait un très efficaceC++, OpenCV port de OpenTLD
.Il est très facile à installer et le suivi est vraiment efficace.
OpenTLD utilise la Médiane des Flux de Tracker pour suivre et met en œuvre des PN algorithme d'apprentissage. Dans ce Vidéo YouTube, Zdenek Kalal montre l'utilisation de OpenTLD.
Si vous voulez juste pour mettre en œuvre une Médiane de Flux de Tracker, suivez ce lien https://github.com/gnebehay/OpenTLD/tree/master/src/mftracker
Si vous voulez l'utiliser en Python, j'ai fait une La Médiane De Flux De Tracker et a également fait un Python port de OpenTLD. Mais python port n'est pas très efficace.
OriginalL'auteur Froyo
Tout d'abord de suivre une voiture, vous devez en quelque sorte le détecter (à l'aide de la couleur de segmentation/soustraction du bruit de fond par exemple). Quand la voiture est détecté, vous avez à le suivre (suivre certains points) à l'aide de
cvCalcOpticalFlowPyrLK
. Je n'ai pas trouver le code qui responces pour la voiture de détection.Prendre un coup d'oeil à cette et cette articles. Votre idée doit être le même.
Également votre code est un peu mal. Par exemple, pourquoi l'appelez-vous
cvGoodFeaturesToTrack
dans la boucle principale? Vous devez appeler une fois avant la boucle pour détecter les bonnes caractéristiques de la piste. Mais cela permettra également de détecter les non-voitures.Prendre un coup d'oeil à défaut d'OpenCV exemple: OpenCV/samples/cpp/lkdemo.cpp.
c'est lent parce que vous appelez
cvGoodFeaturesToTrack
en boucle au lieu de l'appeler avant. Voir un exemple.OriginalL'auteur ArtemStorozhuk