Pyramid Lucas-Kanade optical flow code
En el ámbito de la Visión Artificial, el primer aspecto trata de dar solución a la problemática de la extracción de características de imágenes de forma estática. Entidades como contornos, huecos o cambios en la zona de intensidad pueden ser detectados de una manera cómoda, utilizando generalmente una sola imagen.
Sin duda éste es el paso previo al estudio de la escena a partir de un conjunto de imágenes tomadas de forma separada en el tiempo y, en general, desde distintos puntos de vista.
Con el estudio de una secuencia de imágenes, se pretende estudiar la evolución temporal de los objetos que son capturados por la cámara, para tratar de extraer la mayor cantidad de características de los mismos.
Una de las principales características que puede ser extraída de una secuencia de imágenes es, con mucha diferencia, la velocidad de un objeto. Mediante esta característica, es posible tener una noción diferencial de la posición que tendrá el objeto en el siguiente instante y poder predecir, de esa forma, posibles choques entre objetos o movimientos relativos de la cámara.
Las técnicas de Optical Flow tratan de dar solución a la determinación de la velocidad de los objetos dentro de la secuencia de imágenes.
-
// Pyramid L-K optical flow example
-
//
-
#include "stdafx.h"
-
#include <cv.h>
-
#include <cxcore.h>
-
#include <highgui.h>
-
const int MAX_CORNERS = 500;
-
-
-
int main(int argc, char** argv) {
-
// Initialize, load two images from the file system, and
-
// allocate the images and other structures we will need for
-
// results.
-
//
-
-
// Obtener Imagenes
-
IplImage* imgA = cvLoadImage("image0.jpg",CV_LOAD_IMAGE_GRAYSCALE);
-
IplImage* imgB = cvLoadImage("image1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
-
-
// Tamaño de las Imagenes
-
CvSize img_sz = cvGetSize( imgA );
-
-
//
-
int win_size = 10;
-
IplImage* imgC = cvLoadImage("image1.jpg",CV_LOAD_IMAGE_UNCHANGED);
-
-
// The first thing we need to do is get the features
-
// we want to track.
-
//
-
-
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 ];
-
-
cvGoodFeaturesToTrack(
-
imgA,
-
eig_image,
-
tmp_image,
-
cornersA,
-
&corner_count,
-
0.01,
-
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 the 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 ];
-
-
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, .3 ),
-
0
-
);
-
-
// Now make some image of what we are looking at:
-
-
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 );
-
}
-
-
cvNamedWindow("ImageA",0);
-
cvNamedWindow("ImageB",0);
-
cvNamedWindow("LKpyr_OpticalFlow",0);
-
-
cvShowImage("ImageA",imgA);
-
cvShowImage("ImageB",imgB);
-
cvShowImage("LKpyr_OpticalFlow",imgC);
-
-
cvWaitKey(0);
-
return 0;
-
}

Blog
Foro
Codes
Feed rss