Gunnar-Farneback principio algoritmo Demo & Farneback flujo óptico en el conjunto de datos anormales UCSD

Gunnar-Farneback algoritmo

论文: Two-Frame Motion Estimation basado en la expansión polinómica

期刊: 13ª Conferencia escandinava de Análisis de Imágenes (SCIA 2003)

作者: Gunnar Farnebäck (Laboratorio de Visión por Computador de la Universidad de Linköping, SE-581 83 Linköping, Suecia)

Nota: [email protected] http://www.isy.liu.se/cvl/

En primer lugar, la expansión polinómica

La idea es ampliar el polinomio para cada píxel en el barrio están representados por un polinomio:

f (x) \ sim x ^ {T} Ax + b ^ {T} x + c(1)

En donde A es una matriz simétrica, b es un vector, c es una constante. Coeficiente se calcula de acuerdo con el método de mínimos cuadrados ponderados de valores de señal en el barrio. El peso de dos componentes, conocido como determinista y aplicabilidad. valor de la señal determinista acoplado a áreas adyacentes, de acuerdo con el punto para determinar la idoneidad de puntos pesos relativos en la vecindad de la posición del peso en el vecindario.

En segundo lugar, la estimación de desplazamiento

Debido a que cada barrio puede ser utilizado para aproximar un polinomio, por lo que el primer análisis de un cambio polinomio de lo que sucederá después de la traducción. Considere el siguiente polinomio de segundo grado:

f_ {1} (x) = x ^ {T} A_ {1} x + b_ {1} ^ {T} x + c_ {1}     (2)

En general señal de desplazamiento d para obtener unidades f_ {2}:

f_ {2} = f_ {1} (x - d) ^ {T} A_ {1} (x - d) + b_ {1} ^ {T} (x - d) + c_ {1} = x ^ { T} A_ {2} x + b_ {2} ^ {T} + c_ {2}     (3)

Proporcionada la siguiente ecuación polinomio cuadrático:

A_ {2} = A_ {1}     (4)

b_ {2} = b_ {1} - 2A_ {1} d     (5)

c_ {2} = d ^ {T} A_ {1} d - b_ {1} ^ {T} d + c_ {1}     (6)

Cuando A_ {1}el tiempo es una matriz no singular, se puede resolver re:

2A_ {1} d = - (b_ {2} - B_ {1})     (7)

d = - \ frac {1} {2} A_ {1} ^ {- 1} (b_ {2} - B_ {1})     (8)

En realidad, toda la ausencia de una señal se representa como un polinomio, y traslacional mundial estas dos señales de imagen, la ecuación anterior (7) todavía se aplica a la señal real.

Aquí Global Aproximación polinómica (2) con una ecuación polinómica local. A continuación, las dos imágenes que tienen un desarrollo polinómico, una primera imagen correspondientes coeficientes A_1 (x), b_ {1} (x)y c_ {1} (x)la segunda imagen de la misma manera. Idealmente, según la ecuación (4) debe tener A_ {2} = A_ {1}, pero en realidad debería resolver aproximación:

A (x) = \ frac {A_1 (x) + A_ {2} (x)} {2}     (9)

\ Delta b (x) = - \ frac {1} {2} (b_ {2} (x) - b_ {1} (x))     (10)

A continuación, d (x)en lugar de la parte delantera de las variables globales re:

A (x) d (x) = \ Delta b (x)     (11)

Vamos a empezar a resolver el problema de la estimación vecino. Calcula los valores de cada píxel de acuerdo con la ecuación (11), pero teniendo en cuenta la enorme cantidad de cálculos para hacerlo claramente no es realista. Suponiendo que el proceso de desplazamiento se lleva a cabo lentamente, entonces se debe reducir lo más posible Xel barrio yobúsqueda y encontrar la línea con la ecuación (11) d (x):

$ \ Sum _ {\ Delta x \ epsilon I} ^ w (\ Delta x) \ left \ {.} |  A (x + \ Delta x) d (x) - \ Delta b (x + \ Delta x) \ right \ | ^ {2}     (12)

Aquí set w (\ Delta X)de píxeles función de peso correspondientes, se pueden obtener según el método de los mínimos cuadrados:

d (x) = (\ sum wA ^ {T} A) ^ {- 1} \ sum wA ^ {T} \ Delta b     (13)

En tercer lugar, los parámetros de la campo de desplazamiento

Con el fin de mejorar la robustez del algoritmo, para algunos patrones de movimiento debe ser establecida modelo paramétrico. El siguiente modelo de movimiento en 2D construido con ocho parámetros:

d_ {x} (x, y) = a_ {1} + a_ {2} x + a_ {3} y + a_ {7} x ^ {2} + a_ {8} xy     (15)

d_ {y} (x, y) = a_ {4} + a_ {5} x + a_ {6} y + a_ {7} x ^ {2} + a_ {8} xy

Se puede expresar como la fórmula:

d = S_ {P}      (dieciséis)

S = \ Binom {1, x, y, 0,0,0, x ^ {2}, xy} {0,0,0,1, x, y, xy, y ^ {2}}     (17)

P = (a_ {1}, a_ {2}, a_ {3}, a_ {4}, a_ {5}, a_ {6}, a_ {7}, a_ {8}) ^ {T}      (18)

En la ecuación (12), para obtener un menor problema cuadrados ponderados:

{.} \ Sum_ {i} ^ w_ {i} \ left \ |  A_ {i} S_ {i} P - \ Delta b_ {i} \ right \ | ^ {2}     (19)

Ahora, con las yocoordenadas de la zona de píxeles para el índice, con el método de los mínimos cuadrados se pueden extraer:

P = ({.} \ Sum_ {i} ^ w_ {i} S_ {i} ^ {T} A_ {i} ^ {T} A_ {i} S_ {i}) ^ {- 1} \ sum_ {i } ^ {.} w_ {i} S_ {i} ^ {T} A_ {i} ^ {T} \ Delta b_ {i}     (20)

Aquí se calcularon como antes S_ {i} ^ {T} A_ {i} ^ {T} A_ {i} S_ {i}y S_ {i} ^ {T} A_ {i} ^ {T} \ Delta b_ {i}luego se usa wpara hacer que se obtiene una media ponderada del desplazamiento d (x).

En cuarto lugar, el uso de la información a priori

Hasta ahora todavía hay un problema que dos señales polinómicas locales en las mismas coordenadas, además del desplazamiento es el mismo. Debido a esta expansión es un modelo polinomial parcial, que variará con el desplazamiento espacial, se puede introducir errores (11), y el error aumentará con el aumento del desplazamiento. Así que aquí incorporado información de desplazamiento priori, es decir, una primera señal de comparación Xde un desarrollo polinómico y una segunda señal en x + \ tilde {d} (x)la expansión polinomio en el que \ Tilde {d} (x)el desplazamiento priori redondea valor entero, de modo que sólo necesita ser calculado el verdadero valor basado en estimaciones a priori de desplazamiento.

Alternativamente, el anterior (9) y (10) como:

A (x) = \ frac {A_ {1} (x) + A_ {2} (\ tilde {x})} {2}     (21)

\ Delta b (x) = - \ frac {1} {2} (b_ {2} (\ tilde {x}) - b_ {1} (x)) + A (x) \ tilde {d (x)}     (22)

Entre ellos,

\ Tilde {x} = x + \ tilde {d} (x)     (23)

En quinto lugar, iterativa y las estimaciones de desplazamiento multi-escala

campo de desplazamiento utilizando a priori en el algoritmo puede ser bucle cerrado y ventajas de iteraciones. Tener un buen un medio de estimación a priori de que el desplazamiento relativo es más pequeño, que a su vez puede mejorar la precisión de la estimación de desplazamiento. Aquí considerar dos métodos diferentes, iterativa y el desplazamiento de escala múltiple de una estimación de desplazamiento estimado.

En ambos métodos, la etapa de estimación iterativa de desplazamiento, como un desplazamiento previo siguiente paso. El primer paso es por lo general un campo de desplazamiento priori se inicializa a cero, a menos que exista un mensaje claro. En el primer método, los mismos coeficientes de expansión polinomio en todas las iteraciones, y sólo debe ser calculada una vez. Este es un problema que, si la primera iteración de desplazamiento es demasiado grande (en relación con el desplazamiento previo), salida de desplazamiento no se puede esperar para mejorar e iterativo pierde su significado. Mediante el análisis de la escala gruesa, podemos reducir el problema del desplazamiento excesivo. Esto significa que tenemos alta aplicabilidad a una expansión polinómica. Como resultado, el algoritmo de estimación puede manejar gran desplazamiento, pero la precisión está disminuido.

método de estimación de desplazamiento de escala múltiple, a partir de una escala más general, para obtener una peligrosa, pero razonables estimaciones del desplazamiento, a continuación, obtener estimaciones más y más precisa de la escala gradual refinamiento. Tal desventaja es la necesidad de volver a calcular los coeficientes de dilatación de polinomios para cada escala, pero este costo puede ser reducido por submuestreo entre escalado.

 

método de flujo óptico Demostración Farneback en los conjuntos de datos anormales UCSD

ambiente experimental: Win10 | Python 3.7.3 | OpenCV 4.1.0

código del experimento:

def draw_flow(im, flow, step=16):
    # 在间隔分开的像素采样点处绘制光流
    h, w = im.shape[:2]
    y, x = mgrid[step/2:h:step, step/2:w:step].reshape(2, -1).astype(int)
    fx, fy = flow[y, x].T
    # 创建线的终点
    lines = vstack([x, y, x+fx, y+fy]).T.reshape(-1, 2, 2)
    lines = int32(lines)
    # 创建图像并绘制
    vis = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)
    for (x1, y1), (x2, y2) in lines:
      cv2.line(vis, (x1, y1), (x2, y2), (0, 255, 0), 1)
      cv2.circle(vis, (x1, y1), 1, (0, 255, 0), -1)
    return vis

# 省略N行代码......

# 提取第一帧
first_rgbframe = cv2.imread(frame_path + frames[0], 1)
del frames[0]
prev_gray = cv2.cvtColor(first_rgbframe, cv2.COLOR_BGR2GRAY)

for frame_i in frames:
  rgbframe = cv2.imread(frame_path + frame_i, 1)
  gray = cv2.cvtColor(rgbframe, cv2.COLOR_BGR2GRAY)
  # 计算流
  flow = cv2.calcOpticalFlowFarneback(prev_gray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  prev_gray = gray

  drawImg = draw_flow(gray, flow)
  cv2.imwrite(frameFB_path + frame_i, drawImg)
  # 画出流矢量
  cv2.imshow('Optical flow', drawImg)
  if cv2.waitKey(10) == 27:
     break
  time.sleep(0.1)

Los resultados:

UCSDped1 \ Test \ Test014

UCSDped2 \ Test \ Test005

Los anteriores son el segmento de dos pruebas UCSD anomalía conjunto de datos en, se puede ver por donde pasa la multitud o bicicleta / vehículo, el punto verde será acompañado por ligamiento.

 

Apéndice:

Conjunto de datos de enlace: UCSD detección de anomalías conjunto de datos

OpenCN - calcOpticalFlowFarneback () parámetros que se explican:

prev: solo canal de una imagen de entrada antes de 8

siguiente: Después de una imagen de entrada 8 de un solo canal

flujo: coincide de imagen de entrada calculados con el tamaño y el tipo del flujo óptico en la figura CV_32FC2

pyr_scale: Construcción factor de escalado de imagen (<1) de la pirámide; = coeficiente tal como 0,5 es el modelo de pirámide típica, no en el siguiente nivel es la mitad del tamaño de una imagen de

niveles: las capas de la pirámide; el nivel de estrato de 1 indica que hay un nivel adicional de imagen de entrada directa

winsize: tamaño de la ventana de promedio; la ventana más grande para el ruido de la imagen menos sensible puede ser operación de captura más rápida, pero la operación producirá un campo más desaparecidos

iteraciones: iteraciones cada pirámide jerarquía algoritmo

poly_n: el tamaño de los píxeles en la zona, el barrio que hacer expansión polinómica; cuanto mayor sea el barrio, el más suave de la imagen, el algoritmo es más robusto y estadio más borrosa, un valor de referencia estándar 5 o 7

poly_sigma: suavizado expansión polinomio estándar como una función de derivado de Gaussian básica de la diferencia; cuando poly_n = 5, se puede establecer en 1,1 poly_sigma; cuando poly_n = 7, pueden proporcionarse poly_sigma = 1,5

banderas: se pueden establecer en una de las dos banderas

OPTFLOW_USE_INITIAL_FLOW: la figura flujo óptico usando la entrada como un valor inicial de la estimación de flujo óptico

OPTFLOW_FARNEBACK_GAUSSIAN: winsize × winsize filtro usando un filtro de Gauss en lugar de la estimación de flujo óptico mismo cassette de tamaño; Típicamente, esta opción ofrece más precisa que la corriente z cartucho de filtro a una velocidad inferior, por lo general, una ventana gaussiana caso de que el winsize establecer un valor mayor a fin de lograr el mismo nivel de robustez.

OpenCV explicación oficial originales: haga clic para saltar a los documentos oficiales

 

referencias:

1. Gunnar Farnebäck. De dos fotogramas estimación de movimiento basado en la expansión polinómica [C] // 13ª Conferencia escandinava de Análisis de Imagen (SCIA 2003). Springer-Verlag, 2003.

2. Los  documentos oficiales OpenCV

Publicado cuatro artículos originales · alabanza ganado 13 · vistas 1579

Supongo que te gusta

Origin blog.csdn.net/Carson1145/article/details/105039670
Recomendado
Clasificación