光流量的平均值

时间:2010-11-07 13:28:13

标签: c++ image-processing opencv

我想找到光流的平均值,我可以从第一帧中提取特征,并在下一帧中找到它们的位置。现在,我想找到位移的平均值,以便将图像转换回静止背景,以稳定图像。

// here I take the optical flow 
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features,
                       frame2_features, corner_count, optical_flow_window, 5,
                       optical_flow_found_feature, NULL,
                       optical_flow_termination_criteria, NULL);

// here the features that I extract them 
for( int i=0; i < corner_count; i++ ) {
  CvPoint p,q;
  if ( optical_flow_found_feature[i] == 0 ) continue;
  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 = atan2( (double) p.y - q.y, (double) p.x - q.x );
  double hypotenuse = sqrt( square(p.y - q.y) + square(p.x - q.x) );

现在我想取他们的平均值,如果你想让我向你展示更多的代码,我已经准备好了。

corner_count是功能的数量。

1 个答案:

答案 0 :(得分:1)

我假设你要写的是想要找到两帧之间所有特征点的平均位移。在这种情况下,您所要做的就是在特征循环中计算“斜边”,将其所有值相加,然后除以特征数。

好的,这是你的答案:

cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features, frame2_features, corner_count, optical_flow_window, 5, optical_flow_found_feature, NULL, optical_flow_termination_criteria, NULL);
//here the features that I extract them 

double sumOfDistances = 0;
for(int i = 0; i < corner_count; ++i)
{
   int x1 = (int) frame1_features[i].x;    
   int y1 = (int) frame1_features[i].y;
   int x2 = (int) frame2_features[i].x;  
   int y2 = (int) frame2_features[i].y;

   int dx = x2 - x1;
   int dy = y2 - y1;
   sumOfDistances += sqrt(dx * dx + dy * dy);
}
double averageDistance = sumOfDistances / corner_count;

我在这里假设corner_count是功能的数量。你需要确保它确实是正确的。另外,我还没有尝试编译它。如果我犯了任何错误,你可以自行修理它们。

但是,如果您计划的图像处理不仅仅是这一次,我建议您实际学习一些编程。我在这里做的是非常基本的东西。如果不了解这一点,你就不会走得太远。