1、HS算法
#include "cv.h"
#include "highgui.h"
#include <math.h>
#include <stdio.h>
#include "opencv2/legacy/legacy.hpp"
#define CVX_GRAY50 cvScalar(100)
#define CVX_WHITE cvScalar(255)
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.
// exit if no input images
IplImage *imgA = 0, *imgB = 0;
//imgA = cvLoadImage("OpticalFlow0.jpg",0);
//imgB = cvLoadImage("OpticalFlow1.jpg",0);
//if(!(imgA)||!(imgB)){ printf("One of OpticalFlow0.jpg and/or OpticalFlow1.jpg didn't load\n"); return -1;}
imgA = cvLoadImage("OpticalFlow0.jpg",0);
imgB = cvLoadImage("OpticalFlow1.jpg",0);
if(!(imgA)||!(imgB)){ printf("One of OpticalFlow0.jpg and/or OpticalFlow1.jpg didn't load\n"); return -1;}
IplImage* velx = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_32F,1);
IplImage* vely = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_32F,1);
IplImage* imgC = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_8U,3);
cvNamedWindow( "OpticalFlow0" );
cvNamedWindow( "OpticalFlow1" );
cvNamedWindow( "Flow Results" );
cvShowImage( "OpticalFlow0",imgA );
cvShowImage( "OpticalFlow1",imgB );
// Call the actual Horn and Schunck algorithm
//
cvCalcOpticalFlowHS(
imgA,
imgB,
0,
velx,
vely,
.10,
cvTermCriteria(
CV_TERMCRIT_ITER | CV_TERMCRIT_EPS,
imgA->width,
1e-6
)
);
// Now make some image of what we are looking at:
//
cvZero( imgC );
int step = 4;
for( int y=0; y<imgC->height; y += step ) {
float* px = (float*) ( velx->imageData + y * velx->widthStep );
float* py = (float*) ( vely->imageData + y * vely->widthStep );
for( int x=0; x<imgC->width; x += step ) {
if( px[x]>1 && py[x]>1 ) {
cvCircle(
imgC,
cvPoint( x, y ),
2,
CVX_GRAY50,
-1
);
cvLine(
imgC,
cvPoint( x, y ),
cvPoint( x+px[x]/2, y+py[x]/2 ),
CV_RGB(255,0,0),
1,
0
);
}
}
}
// show tracking
cvShowImage( "Flow Results",imgC );
cvWaitKey(0);
// destroy windows
cvDestroyWindow( "OpticalFlow0" );
cvDestroyWindow( "OpticalFlow1" );
cvDestroyWindow( "Flow Results" );
// release memory
cvReleaseImage( &imgA );
cvReleaseImage( &imgB );
cvReleaseImage( &imgC );
return 0;
}
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.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.
//IplImage* imgA = cvLoadImage("OpticalFlow0.jpg",CV_LOAD_IMAGE_GRAYSCALE);
//IplImage* imgB = cvLoadImage("OpticalFlow1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
IplImage* imgA = cvLoadImage("3.jpg",CV_LOAD_IMAGE_GRAYSCALE);
IplImage* imgB = cvLoadImage("4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
//IplImage* imgA = cvLoadImage("10.png",CV_LOAD_IMAGE_GRAYSCALE);
//IplImage* imgB = cvLoadImage("11.png",CV_LOAD_IMAGE_GRAYSCALE);
CvSize img_sz = cvGetSize( imgA );
int win_size = 10;
//IplImage* imgC = cvLoadImage("OpticalFlow1.jpg",CV_LOAD_IMAGE_UNCHANGED);
IplImage* imgC = cvLoadImage("4.jpg",CV_LOAD_IMAGE_UNCHANGED);
//IplImage* imgC = cvLoadImage("11.png",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, 3 );
IplImage* tmp_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 3 );
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,3 );
IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F,3 );
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;
}