資源簡介
基于OPENCV的光流法,使用的是LK金字塔算法
代碼片段和文件信息
/*
?*?--Sparse?Optical?Flow?Demo?Program--
?*?Written?by?David?Stavens?(david.stavens@ai.stanford.edu)
?*/
#include?
#include?
#include?
#include?
static?const?double?pi?=?3.14159265358979323846;
inline?static?double?square(int?a)
{
return?a?*?a;
}
/*?This?is?just?an?inline?that?allocates?images.??I?did?this?to?reduce?clutter?in?the
?*?actual?computer?vision?algorithmic?code.??Basically?it?allocates?the?requested?image
?*?unless?that?image?is?already?non-NULL.??It?always?leaves?a?non-NULL?image?as-is?even
?*?if?that?image‘s?size?depth?and/or?channels?are?different?than?the?request.
?*/
inline?static?void?allocateOnDemand(?IplImage?**img?CvSize?size?int?depth?int?channels?)
{
if?(?*img?!=?NULL?) return;
*img?=?cvCreateImage(?size?depth?channels?);
if?(?*img?==?NULL?)
{
fprintf(stderr?“Error:?Couldn‘t?allocate?image.??Out?of?memory?\n“);
exit(-1);
}
}
int?main(void)
{
/*?Create?an?object?that?decodes?the?input?video?stream.?*/
CvCapture?*input_video?=?cvCaptureFromFile(
“E:\\optical_flow_demo\\18_01.avi“
);
if?(input_video?==?NULL)
{
/*?Either?the?video?didn‘t?exist?OR?it?uses?a?codec?OpenCV
?*?doesn‘t?support.
?*/
fprintf(stderr?“Error:?Can‘t?open?video.\n“);
return?-1;
}
/*?Read?the?video‘s?frame?size?out?of?the?AVI.?*/
CvSize?frame_size;
frame_size.height?=
(int)?cvGetCaptureProperty(?input_video?CV_CAP_PROP_frame_HEIGHT?);
frame_size.width?=
(int)?cvGetCaptureProperty(?input_video?CV_CAP_PROP_frame_WIDTH?);
/*?Determine?the?number?of?frames?in?the?AVI.?*/
long?number_of_frames;
/*?Go?to?the?end?of?the?AVI?(ie:?the?fraction?is?“1“)?*/
cvSetCaptureProperty(?input_video?CV_CAP_PROP_POS_AVI_RATIO?1.?);
/*?Now?that?we‘re?at?the?end?read?the?AVI?position?in?frames?*/
number_of_frames?=?(int)?cvGetCaptureProperty(?input_video?CV_CAP_PROP_POS_frameS?);
/*?Return?to?the?beginning?*/
cvSetCaptureProperty(?input_video?CV_CAP_PROP_POS_frameS?0.?);
/*?Create?a?windows?called?“Optical?Flow“?for?visualizing?the?output.
?*?Have?the?window?automatically?change?its?size?to?match?the?output.
?*/
cvNamedWindow(“Optical?Flow“?CV_WINDOW_AUTOSIZE);
long?current_frame?=?0;
while(true)
{
static?IplImage?*frame?=?NULL?*frame1?=?NULL?*frame1_1C?=?NULL?*frame2_1C?=?NULL?*eig_image?=?NULL?*temp_image?=?NULL?*pyramid1?=?NULL?*pyramid2?=?NULL;
/*?Go?to?the?frame?we?want.??Important?if?multiple?frames?are?queried?in
?*?the?loop?which?they?of?course?are?for?optical?flow.??Note?that?the?very
?*?first?call?to?this?is?actually?not?needed.?(Because?the?correct?position
?*?is?set?outsite?the?for()?loop.)
?*/
cvSetCaptureProperty(?input_video?CV_CAP_PROP_POS_frameS?current_frame?);
/*?Get?the?next?frame?of?the?video.
?*?IMPORTANT!??cvQueryframe()?always?returns?a?pointer?to?the?_same_
?*?memory?location.??So?successive?calls:
?*?frame1?=?cvQueryframe();
評論
共有 條評論