光流法-运动目标的检测(opencv学习)

本文介绍如何利用OpenCV库中的cvGoodFeaturesToTrack函数选择特征点,并结合cvCalcOpticalFlowPyrLK函数实现运动目标的检测。程序通过创建图像金字塔,计算特征点并跟踪目标位置。
摘要由CSDN通过智能技术生成
 
光流法-运动目标的检测(opencv学习)
2011-11-04 11:00

        cvCalcOpticalFlowPyrLK 函数在使用时,首先要确定特征点,也就是目标旧的位置。

        本程序通过使用cvGoodFeaturesToTrack 函数选择角点作为特征点。

        本程序只是一个简单的运动检测,在具体应用过程中,可以根据自己的需要修正

#include <cv.h>
#include <highgui.h>

int main (int argc, char **argv)

 CvCapture* capture = 0;
 capture = cvCaptureFromCAM(  CV_CAP_ANY ); 

 
 int i;

 int corner_count = 1000; 

 CvTermCriteria criteria; 
 criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01);

 IplImage *src_img1;
 IplImage *src_img2;

 IplImage *dst_img;
 IplImage *pre_img;
 

 IplImage *eig_img;
 IplImage *temp_img;

 IplImage *prev_pyramid;
 IplImage *curr_pyramid;

 CvPoint2D32f *corners1;
 CvPoint2D32f *corners2; 
 corners1 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f)); 
 corners2 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
 cvNamedWindow ("Image", 1);
 char *status;
 status = (char *) cvAlloc (corner_count); 
 while (1)
 {
  
  pre_img = cvQueryFrame(capture);

  CvSize img_sz = cvGetSize(pre_img);
  src_img1 = cvCreateImage(img_sz, IPL_DEPTH_8U, 1);
  cvCvtColor(pre_img, src_img1, CV_RGB2GRAY);

  dst_img = cvQueryFrame(capture);
  src_img2 = cvCreateImage(img_sz, IPL_DEPTH_8U, 1);
  cvCvtColor(dst_img, src_img2, CV_RGB2GRAY);
  
  eig_img = cvCreateImage (img_sz, IPL_DEPTH_32F, 1);
  temp_img = cvCreateImage (img_sz, IPL_DEPTH_32F, 1);

 

  prev_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1); 
  curr_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);


   
  cvGoodFeaturesToTrack (src_img1, eig_img, temp_img, corners1, &corner_count, 0.001, 5, NULL);

  cvCalcOpticalFlowPyrLK (src_img1, src_img2, prev_pyramid, curr_pyramid,                      
   corners1, corners2, corner_count, cvSize (10, 10), 4, status, NULL, criteria, 0); 

  for (i = 0; i < corner_count; i++)
  {   
   if (status[i])     
    cvLine (dst_img, cvPointFrom32f (corners1[i]), cvPointFrom32f (corners2[i]), CV_RGB (255, 0, 0), 1, CV_AA, 0); 
  } 
  
  cvShowImage ("Image", dst_img); 
  cvWaitKey (1);
  cvReleaseImage (&src_img1); 
  cvReleaseImage (&src_img2);
  cvReleaseImage (&eig_img);
  cvReleaseImage (&temp_img); 
  cvReleaseImage (&prev_pyramid); 
  cvReleaseImage (&curr_pyramid);

 }

 cvDestroyWindow ("Image");
 cvReleaseImage (&dst_img);
 cvReleaseImage(&pre_img);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值