Hace un par de años Habré deslizó dos artículos que mencionan un algoritmo interesante. Artículos, sin embargo, fueron escritos nechitabilno. En el estilo de "noticias» (
1 ,
2 ), pero el vínculo con el sitio estaba presente, fue posible para averiguar detalles sobre
(algoritmo de autoría MIT). Y hubo magia. Absolutamente algoritmo mágico que permite ver lo invisible. Ambos autores Habré no se dio cuenta y se centran en el hecho de que el algoritmo nos permite ver el pulso. Después de haber perdido lo más importante.
El algoritmo nos permite fortalecer el movimiento, ojo invisible, para mostrar las cosas que nunca se han visto con vida. Vídeo ligeramente superior -
presentación c cfqnf MIT segunda parte del algoritmo. Microsacadas, que se enumeran comenzando desde el 29 de segundo, observó anteriormente sólo como un reflejo de los espejos montados en los alumnos. Y aquí se ven a través de los ojos.
Hace un par de semanas, me encontré de nuevo los artículos. Inmediatamente me entró curiosidad: lo que la gente hizo en esos dos años para prepararse? Pero ... el vacío. Se ha definido la siguiente semana divertido y medio. Quiero hacer el mismo algoritmo y averiguar lo que puede hacer con ella y por qué todavía no está en todos los teléfonos inteligentes, al menos por un pulso.
El artículo será de una gran cantidad de vídeos, imágenes, estera un poco de código y las respuestas a las preguntas.
Vamos a empezar con las matemáticas (no voy a pegarse a cualquier artículo en particular, y voy a interferir en diferentes partes de los diferentes artículos, por una narrativa más suave). Un grupo de investigación tiene dos importantes obras en la parte algorítmica:
1)
para revelar los cambios sutiles en el Mundial
2)
movimiento de vídeo Procesamiento -Based_Video.pdf"> href="http://people.csail.mit.edu/billf/publications/Phase Basado Fase-
.
empezar? H4> ¿Cuál es la ganancia de movimiento? Fortalecimiento de movimiento, es cuando podemos predecir en qué dirección la señal se mezcla y colóquela más en esa dirección.
Supongamos que tenemos un receptor de una sola dimensión. En el receptor, se ve que la señal I (x, t) = f (x). En la imagen dibujada en un negro (hasta cierto punto t) .En la siguiente señal de tiempo I (x, t + 1) = f (x + Δ) (azul). Amplificar esta señal, lo que significa recibir una señal I '(x, t + 1) = f (x + 1 + α) Δ (). Aquí α - ganancia. La expansión en serie de Taylor que se puede expresar como:
Vamos:
¿Qué es B? En términos generales es I (x, t + 1) - I (x, t). Draw:
Por supuesto, esto es inexacto, sino como un descenso aproximación (forma pokazyaet tal señal gráfica azul "priblizhenongo"). Si multiplicamos por B (1 + α) y que será "fortalecimiento" de la señal. Get (gráfico rojo):
En marco de verdadera puede contener varios movimientos, cada uno de los cuales irán a diferentes velocidades. El método anterior - predicción lineal, sin entrar en detalles, que se rompe. Pero, hay un enfoque clásico para resolver este problema, que se utilizó en el trabajo -. Para difundir el movimiento de la respuesta de frecuencia (tanto espacial como temporal)
En la primera etapa de descomposición de imagen de frecuencia espacial. Esta etapa también implementa recibir ∂f diferencial (x) / ∂x. En primera no trabajamos dicen cómo lo implementan. En segundo trabajo , mediante el uso de un enfoque de fase, los filtros de amplitud y fase Gabbora considerarse un orden diferente:
Acerca de lo que hice, teniendo el filtro:
Y el valor normalizado para
Aquí l - la distancia del píxel del centro del filtro. Por supuesto, estoy un poco fingido tener un filtro para un solo valor de σ ventana. Esto ha acelerado la computación. Esto da una imagen un poco más borrosa, pero decidió no luchar por la precisión.
Volviendo a las fórmulas. Supongamos que queremos amplificar la señal, dando una respuesta característica en la frecuencia ω en la secuencia de marco temporal. Ya hemos recogido el filtro espacial característico con una σ ventana. Esto nos da un diferencial aproximado en cada punto. Como se desprende de la fórmula - no es sólo una función temporal dando información sobre nuestro progreso y la ganancia. Multiplicado por el seno de la frecuencia que desea reforzar (y que funcionará dando el tiempo de respuesta). Obtenemos:
Por supuesto, mucho más fácil que en el artículo original, pero un poco menos de un problema con la velocidad.
Código y el resultado H4> fuente para el primer artículo se establece en el acceso abierto a Matlab.:. Al parecer, ¿por qué reinventar la rueda y escribir su propio? Pero había una serie de razones, en gran medida vinculados a Matlab:
- Si a continuación, vienen a la mente para hacer algo razonable y aplicable al código de Matlab mucho más difícil de usar que C # + OpenCV, portado en un par de horas con ++.
- El código original fue guiado para trabajar con vídeo guardado que tiene una tasa de bits constante. Para poder utilizar la cámara está conectada a un ordenador que tiene una necesidad de velocidad de bits variable para cambiar la lógica.
- El código original implementa el más fácil de sus algoritmos sin bollos. Implementar una versión ligeramente más sofisticada con bollos - ya la mitad del trabajo. Por otra parte, a pesar del hecho de que el algoritmo fue el original, sus parámetros de entrada no son esos artículos.
- El código original llevado periódicamente a un ordenador colgar muertos (incluso sin la pantalla azul). Tal vez sólo yo, pero incómodo.
- En el código original era sólo el modo consola. Hacer todo en Matlab visual, que sé que es mucho peor VS, que sería mucho más largo que reescribir todo. < / a> He publicado en github.com y comenté en detalle. El programa implementa la captura de vídeo de la cámara y su análisis en tiempo real. La optimización se volvió ligeramente hacia la izquierda, pero usted puede conseguir encerrado, ampliar las opciones. Eso circuncidados en el nombre de la optimización:
- Use un marco con un tamaño reducido. Muy acelera el trabajo. En el formulario, no hubo manera de deducir el tamaño del marco, pero si abre el código, la línea:... & Quot; _capture.QueryFrame () Convierte & lt; Bgr, flotar & gt; () PyrDown () PyrDown (); & quot; eso es todo
Use sólo uno de los filtros espaciales. Para situaciones donde el movimiento se conoce la pérdida deseada acrítica. La gestión de parámetro de forma del filtro (la longitud de onda del filtro Gabor). Usar una sola frecuencia, hace hincapié en las series temporales. Por supuesto, era posible hacer convolución con pre-calculado con el espectro de la ventana con casi ninguna pérdida de rendimiento, pero este método también funciona bien. Con cualquier forma de control deslizante controlada, o mediante la introducción de los valores límite. Una pequeña nota. Todos los resultados se obtuvieron en una cámara web convencional en casa. Cuando utilice la cámara con buenos parámetros + Trípode + adecuada iluminación + calidad supresión de interferencias 50Hz mejoró significativamente. Mi objetivo no era obtener hermosas fotografías o mejorado algoritmo. El objetivo - para obtener resultados en casa. Bueno, como un bono, yo todavía hacer un pulso de registro cuando juego Starctaft 2 ... Curiosamente, en lo que sigue los deportes e-deportivas.
Como resultado, se obtiene la operación lógica:
Es muy sencillo de indignante. Por ejemplo sumatoria incrementales con el marco por lo general, se dio cuenta:
& lt; código & gt; for (int x = 0; x & lt; Ic [CCP] .I.Width; x ++) for (int y = 0; y & lt; Ic [CCP] .I.Height; y ++) { FF2.Data [y, x, 0] = alfa * FF2.Data [y, x, 0] / contador; ImToDisp.Data [y, x, 0] = (byte) Math.Max (0, Math.min ((FF2.Data [y, x, 0] + ImToDisp.Data [y, x, 0]), 255) ); } & Lt; / código de & gt; pre> (Sí, ya sé que con OpenCV no es la mejor manera)
En algún lugar en el 90% del código no es el kernel, I Kit alrededor de ella. Pero la realización del núcleo ya da un buen resultado. Se ve como el pecho inflado por unas pocas decenas de centímetros de la respiración, es visto como hincha de Viena como mueve la cabeza en el tiempo con el pulso.
Aquí se explica en detalle por qué la cabeza bobble del pulso. De hecho, se vuelve de relleno de la sangre en el corazón: