2010-11-07 5 views
0

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

// 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)); 

Теперь я хочу взять среднее для них, и если вы хотите, чтобы я показал вам больше кода я готов сделать это.

Угол_количество - это число функций.

+3

Я предлагаю вам (а) задать вопрос - все, что вы сейчас делаете, это сказать нам, что вы хотите сделать, и мы догадываемся о том, с чем вы столкнулись, (b) отформатируйте код как код - - см. значки над текстовым полем, в котором вы создаете/редактируете свой вопрос, (c) –

ответ

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

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

+0

@ Дима, да, это совершенно верно, что я искал, не могли бы вы уточнить мой код, потому что я не хороший программист. Большое вам спасибо за ваш ответ. – Mario

+0

@ Dima, есть все равно, чтобы связаться с вами, чтобы показать вам мой код, я знаю, как программа и эти вещи, но им не очень хорошо. – Mario

+1

Слушайте, я имею в виду отсутствие неуважения, и я не хочу быть грубым, но если вы не знаете, как писать код для вычисления среднего числа чисел, то вы не знаете, как программировать. По крайней мере, вы не знаете, как программировать на C++. Извините, но у меня нет времени отлаживать ваш код для вас, и я также не считаю, что это поможет вам в долгосрочной перспективе. Вам нужно получить книгу на C++ и изучить основы, чтобы вы действительно понимали, что означает каждая строка вашего кода. В противном случае это не поможет вам, если кто-то еще исправит ваш код. Прошу прощения, если мои слова кажутся суровыми, но это правда. – Dima

Смежные вопросы