aihot  2017-05-27 19:08:15  OpenCV |   查看评论   
cvCalcOpticalFlowPyrLK 需要确定特征点。
 
本程序,通过帧差获得运动的点作为特征点。
 
本程序原本的目的是计算运动点的速度,通过修正可以进行运动跟踪。
 
  • #include <cv.h>
  •  
  • #include <highgui.h>
  •  
  • #include <iostream>
  •  
  • using namespace std;
  •  
  • int const MAX_CORNERS = 1000;
  •  
  • int main (int argc, char **argv)
  •  
  •  
  •     CvCapture* capture = 0;
  •  
  •     capture = cvCaptureFromCAM(  CV_CAP_ANY );  //get frame
  •  
  •  
  •  
  •     IplImage *src_img1;  //the previous frame (gray)
  •  
  •     IplImage *src_img2;  //the current frame(gray)
  •  
  •  
  •  
  •     IplImge *dst_img;   //the result
  •  
  •     IplImage *cur_img;   
  •  
  •     IplImage *pre_img;
  •  
  •  
  •  
  •     CvPoint2D32f * move_old_point = new CvPoint2D32f[ MAX_CORNERS];
  •  
  •     CvPoint2D32f * move_new_point = new CvPoint2D32f[ MAX_CORNERS];
  •  
  •     char *features_found = new char[MAX_CORNERS];
  •  
  •     float *features_error = new float[MAX_CORNERS];
  •  
  •     CvTermCriteria criteria;
  •  
  •     criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01);
  •  
  •     while(1)
  •  
  •     {
  •  
  •         int i,j;
  •  
  •         int dx, dy;
  •  
  •         int p = 0;
  •  
  •         int rows, cols;
  •  
  •         int countn = MAX_CORNERS;
  •  
  •         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);
  •  
  •  
  •  
  •         cur_img = cvQueryFrame(capture);
  •  
  •         src_img2 = cvCreateImage(img_sz, IPL_DEPTH_8U, 1);
  •  
  •         cvCvtColor(cur_img, src_img2, CV_RGB2GRAY);
  •  
  •         dst_img = (IplImage *)cvClone(cur_img);
  •  
  •  
  •  
  •         IplImage *move_img = cvCreateImage(img_sz, IPL_DEPTH_8U, 1);
  •  
  •         cvZero(move_img);
  •  
  •         //cvAbsDiff(src_img1, src_img2,move_img);
  •  
  •         cols = src_img1->width; 
  •  
  •         rows = src_img1->height;
  •  
  •         for (i = 0; i <cols; i++)
  •  
  •         {
  •  
  •             for (j = 0; j<rows; j++)
  •  
  •             {
  •  
  •                 double a = abs(cvGet2D(src_img1, j, i).val[0]-cvGet2D(src_img2, j, i).val[0]);
  •  
  •                 CvScalar b = cvScalar(a, 0, 0,0);
  •  
  •                 cvSet2D(move_img, j, i,b);
  •  
  •                 if (a>40)
  •  
  •                 {
  •  
  •                     if (p<MAX_CORNERS-1)
  •  
  •                     {
  •  
  •                         int d = ++p;
  •  
  •                         move_old_point[d].x = i;
  •  
  •                         move_old_point[d].y = j;
  •  
  •                     }
  •  
  •                 }
  •  
  •             }
  •  
  •         }
  •  
  •         cvNamedWindow("moving object", 1);
  •  
  •         cvShowImage("moving object", move_img);
  •  
  •  
  •  
  •         CvSize Pyrsize = cvSize(src_img1->width +8, src_img1->height/3);
  •  
  •         IplImage * pyrA = cvCreateImage(Pyrsize, IPL_DEPTH_32F, 1); //pyrA是需要寻找的点,不是没有初始化的
  •  
  •         IplImage * pyrB = cvCreateImage(Pyrsize, IPL_DEPTH_32F, 1);
  •  
  •  
  •  
  •         cvCalcOpticalFlowPyrLK(src_img1,
  •  
  •             src_img2,
  •  
  •             pyrA,
  •  
  •             pyrB,
  •  
  •             move_old_point,
  •  
  •             move_new_point,
  •  
  •             countn,
  •  
  •             cvSize(10, 10),
  •  
  •             3,
  •  
  •             features_found,
  •  
  •             features_error,
  •  
  •             criteria,
  •  
  •             0
  •  
  •             );
  •  
  •         for (i = 0; i < countn; i++)
  •  
  •         {  
  •  
  •             int x1 = (int)move_new_point[i].x;
  •  
  •             int x2 = (int)move_old_point[i].x;
  •  
  •             int y1 = (int)move_new_point[i].y;
  •  
  •             int y2 = (int)move_old_point[i].y;
  •  
  •  
  •  
  •             dx =(int) abs(x1 - x2) ;
  •  
  •             dy = (int)abs(y1 - y2);
  •  
  •             if (dx >= 5&& dy >= 5)
  •  
  •             {
  •  
  •                 cvLine (dst_img, cvPoint(x2, y2),cvPoint(x2+5, y2+5) , CV_RGB (255, 0, 0), 1, CV_AA, 0);
  •  
  •             }
  •  
  •         }
  •  
  •  
  •  
  •         cvNamedWindow ("ImagePyrLK", 1); 
  •  
  •         cvShowImage ("ImagePyrLK", dst_img);
  •  
  •         cvWaitKey (1);
  •  
  •         cvReleaseImage (&dst_img);
  •  
  •         cvReleaseImage(&pyrA);
  •  
  •         cvReleaseImage(&pyrB);
  •  
  •         cvReleaseImage(&move_img);
  •  
  •     }
  •  
  •  
  •  
  •     cvDestroyWindow("moving object");
  •  
  •     cvDestroyWindow ("ImagePyrLK"); 
  •  
  •     cvReleaseImage (&src_img1);
  •  
  •     cvReleaseImage (&src_img2);
  •  
  •  
  •  
  •     cvReleaseImage (&pre_img);
  •  
  •     cvReleaseImage (&cur_img);
  •  
  •  
  •  
  •     return 0;
  •  
  • }
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自运动目标检测__光流法

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]