среднее оптического потока - PullRequest
0 голосов
/ 07 ноября 2010

Я хочу найти среднее значение оптического потока, я мог бы извлечь элементы из первого кадра и найти их местоположение в следующем кадре.Теперь я хочу найти среднее смещение, чтобы перевести изображение обратно на его неподвижный фон, чтобы стабилизировать изображение.

// 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 Ответ

1 голос
/ 07 ноября 2010

Я предполагаю из того, что вы написали, что вы хотите найти среднее смещение всех характерных точек между двумя кадрами. В этом случае все, что вам нужно сделать, это вычислить «гипотенузу» в цикле над объектами, сложить все их значения, а затем разделить на количество объектов.

Хорошо, вот ваш ответ:

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 - это число функций. Вы должны убедиться, что это действительно правильно. Кроме того, я не пытался скомпилировать это. Если бы я допустил какие-либо ошибки, вы бы их исправили.

Однако, если вы планируете выполнять обработку изображений не только один раз, я советую вам на самом деле научиться программированию. То, что я сделал здесь, очень элементарно. Без понимания этого для себя вы не уйдете очень далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...