求助LK金字塔光流法添加可以手动选取跟踪区域的代码!!!

本人做论文,事情非常紧急,本人已经做出了光流法自动显示标记实时跟踪,但是导师要求要选取跟踪目标,并根据物体运动改变选取的窗口大小和形状,本人的代码如下,还请会的大神们帮助我,真的十分着急还不知道怎么办 了。

#include <opencv2\opencv.hpp>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>

using namespace cv;
static const double pi = 3.14159265358979323846;

inline static double square(int a)
{
 return a * a;
}

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(int argc, char *argv[])
{
 //读取摄像头
 VideoCapture cap(0);
 //读取视频文件
 //VideoCapture cap; cap.open("Test.avi");
 if (!cap.isOpened())
 {
  return -1;
 }
 Mat frame;
 
 CvSize frame_size;
 frame_size.height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
 frame_size.width = cap.get(CV_CAP_PROP_FRAME_WIDTH);

 while (true)
 {
  static IplImage *frame = NULL, *frame1 = NULL, *frame1_1C = NULL,
   *frame2_1C = NULL, *eig_image = NULL, *temp_image = NULL,
   *pyramid1 = NULL, *pyramid2 = NULL;
  Mat framet;
 
  cap.read(framet);
  Mat edges;

  frame = &IplImage(framet);
  if (frame == NULL)
  {
   fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
   return -1;
  }
 
  allocateOnDemand(&frame1_1C, frame_size, IPL_DEPTH_8U, 1);

  cvConvertImage(frame, frame1_1C, 0);
  
  allocateOnDemand(&frame1, frame_size, IPL_DEPTH_8U, 3);
  cvConvertImage(frame, frame1, 0);
 
  //cap >> framet;
  cap.read(framet);

  frame = &IplImage(framet);
  if (frame == NULL)
  {
   fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
   return -1;
  }
 
  allocateOnDemand(&frame2_1C, frame_size, IPL_DEPTH_8U, 1);
  cvConvertImage(frame, frame2_1C, 0);

  allocateOnDemand(&eig_image, frame_size, IPL_DEPTH_32F, 1);
  allocateOnDemand(&temp_image, frame_size, IPL_DEPTH_32F, 1);
 
  CvPoint2D32f frame1_features[400];
  int number_of_features = 400;
  
  cvGoodFeaturesToTrack(frame1_1C, eig_image, temp_image,
   frame1_features, &number_of_features, .01, .01, NULL);

  CvPoint2D32f frame2_features[400];

  char optical_flow_found_feature[400];

  float optical_flow_feature_error[400];
  
  CvSize optical_flow_window = cvSize(5, 5);
  
  CvTermCriteria optical_flow_termination_criteria = cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3);
 
  allocateOnDemand(&pyramid1, frame_size, IPL_DEPTH_8U, 1);
  allocateOnDemand(&pyramid2, frame_size, IPL_DEPTH_8U, 1);
  
  cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features, frame2_features, number_of_features,
   optical_flow_window, 5, optical_flow_found_feature, optical_flow_feature_error, optical_flow_termination_criteria, 0);
 
  for (int i = 0; i< number_of_features; i++)
  {
   
   if (optical_flow_found_feature[i] == 0)
    continue;
   int line_thickness;
   line_thickness = 1;
   
   CvScalar line_color;
   line_color = CV_RGB(255, 0, 0);
   
   CvPoint p, q;
   p.x = (int)frame1_features[i].x;
   p.y = (int)frame1_features[i].y;
   q.x = (int)frame2_features[i].x;
   q.y = (int)frame2_features[i].y;
   double angle;
   angle = atan2((double)p.y - q.y, (double)p.x - q.x);
   double hypotenuse;
   hypotenuse = sqrt(square(p.y - q.y) + square(p.x - q.x));
   
   q.x = (int)(p.x - 5 * hypotenuse * cos(angle));
   q.y = (int)(p.y - 5 * hypotenuse * sin(angle));
   // "p" 线的开始点. "q" 线的终止点. "CV_AA" 反锯齿."0" 没有小数位.
   cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
   p.x = (int)(q.x + 9 * cos(angle + pi / 4));
   p.y = (int)(q.y + 9 * sin(angle + pi / 4));
   cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
   p.x = (int)(q.x + 9 * cos(angle - pi / 4));
   p.y = (int)(q.y + 9 * sin(angle - pi / 4));
   cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
  }
 
  cvNamedWindow("Optical Flow", CV_WINDOW_NORMAL);
  cvFlip(frame1, NULL, 2);
  cvShowImage("Optical Flow", frame1);
  cvWaitKey(33);
 }
 cap.release();
 cvWaitKey(33);
 system("pause");
}

猜你喜欢

转载自blog.csdn.net/weixin_42178848/article/details/80265911
今日推荐