You are on page 1of 3

Дополнение

Улучшенная обработка
оптического потока для
управления объектами
Соображения
(Анализируются свойства метода Lucas-Canade)

1. Оптический поток вычисляется неустойчиво - поэтому нужно усреднять значения


по области вокруг объекта,

2. И при этом игнорировать выбросы - то есть длинные вектора.

3. Оптический поток дает вектор движения только у границы объекта - поэтому имеет
смысл увеличивать область анализа.

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

5. Возможно также такое условие: если число точек, давших вклад, мало - то считать
поток в области нулевым, так как суммирование малого числа векторов даст, скорее
всего, выброс.

6. Для повышения гладкости отклика - стоит вести усреднение, используя весовую


функцию Гаусса.
Реализация
То есть, для анализа движения кружка (x,y) радиуса R можно предложить такой алгоритм:

int r = R * 2; //увеличиваем область анализа (3)


ofPoint sum( 0, 0 );
float n = 0.0;
for (int y1 = -r; y1 < r; y1++){ //ведем усреднение (1)
for (int x1 = -r; x1 < r; x1++){
if ( x1 * x1 + y1 * y1 <= r * r ){
int x2 = x + x1;
int y2 = y + y1;
if ( x2 >= 0 && x2 < w && y2 >= 0 && y2 < h ){
float dx = cvmGet( motionX, y2, x2 );
float dy = cvmGet( motionY, y2, x2 );
float len = dx * dx + dy * dy;
if ( len <= ( w/10 * h/10 ) //не выброс (2)
&& len > 10 //не пусто (4)
){
float weight = 1.0; //вместо него можно поставить функцию Гаусса g( x1, y1 ) (6)
sum += ofPoint( dx, dy ) * weight ;
n += weight ;
}
}
}
}
}
ofPoint d = sum;
float nThresh = 0.0; //Можно поставить ненулевое значение, чтоб повысить устойчивость к помехам (5)
if ( n > nThresh ) { d /= n; }
ofPoint force = d; //Результат

You might also like