GerardoMunoz / gestos

0 stars 12 forks source link

¿Cómo detectar que la mano está apuntando? #1

Open GerardoMunoz opened 3 years ago

GerardoMunoz commented 3 years ago

Para determinar el gesto de mano abierta y cerrada se usaron las distancias de los dedos. Pero para este problema no se pueden usar las distancias sino las direcciones, es decir el coseno del ángulo entre dos vectores.

Yo espero que las personas que comiencen la discusión hablen de cómo solucionar algebraicamente el problema.

Luego, la discusión podría enfocarse a como se representar los vectores de los dedos utilizando los puntos en 3D dados por https://google.github.io/mediapipe/solutions/hands#hand-landmark-model

Finalmente, la discusión debería tornar en cómo implementar las ecuaciones obtenidas en la rutina calcula_gestos(puntos)

Es importante su participación, aunque su comentario no sea del todo acertado, ya que eso permite la discusión del grupo. Se vale hacer propuestas y preguntas.

Julian0409 commented 3 years ago

Buenas tarde compañeros, con respecto al problema de la semana 8 mi idea para cerrar la mano es tomar los vectores (1,9) y (9,12) y que cuando el coseno de estos vectores sea igual a 1(angulo 0) podamos decir que ese dedo esta cerrado. de la misma forma para los demas dedeos(meñique,anular,medio). ¿Que les parece?

Johan1125 commented 3 years ago

Buenas noches, respecto al problema propuesto de la semana 8 pienso que la forma indicada de llegar al objetivo es haciendo el promedio de los puntos [1,9,13,17], luego con estos sacar el coseno del ángulo respecto al dedo índice cuando este se encuentra apuntando [punto 8], pero a diferencia de mi compañero pienso que esto daría un ángulo de 90° y por ende dará cero y su vez los vectores serán ortogonales entre si.

Dani0524 commented 3 years ago

Buenas tardes, referente con el problema postulado tengo la idea de como el programa detecte la mano apuntado, pienso que se debe tomar de referencia el punto (:8), para que así se sepa que este se encuentra activo y a su vez sacamos el coseno del ángulo respecto a los demás dedos, en sus respectivos puntos (:1)(:9)(:13)(:17), pero este procedimiento se debe realizar por aparte pues quizá el ángulo que forme el índice con otro no sea precisamente de 90°.

JosephCastillo26 commented 3 years ago

Buenas noches. Analizando los comentarios anteriores los compañeros tienen razon en los puntos que hay que tomar como referencia y los que hay que promediar dado que la prioridad es obtener el angulo de 90° para que de ese angulo de referencia sea el que permita acomodar el programa para que al obtener diferentes angulos y que asi este detecte el cambio en la posicion de los dedos.

GerardoMunoz commented 3 years ago

Si están de acurdo con la solución planteada con palabras, los invito a plantear esa solución mediante ecuaciones vectoriales.

PhilipMMillan commented 3 years ago

Buenas noches teniendo en cuenta algunos temas de clase, y un par de videos del funcionamiento de Mediapipe, lo que yo plantearía para la solución para detectar si la mano esta apuntando o no, seria:

  1. Asignar los valores de los puntos de cada dedo a un vector, teniendo así los vectores (1;2;3;4), (5;6;7;8),(9;10;11;12),(13;14;15;16),(17;18;19;20).

  2. Hallar la norma (magnitud) de cada vector: |→ | | u | =sqrt{v1^2+v1^2+...vn^2}

| v1 |=sqrt{(1^2)+(2^2)+(3^2)+(4^2)}; | v2 |=sqrt{(5^2)+(6^2)+(7^2)+(8^2)}; | v3 |=sqrt{(9^2)+(10^2)+(11^2)+(12^2)}; | v4 |=sqrt{(13^2)+(14^2)+(15^2)+(16^2)}; | v5 |=sqrt{(17^2)+(18^2)+(19^2)+(20^2)};

  1. Calcular Angulo entre (v1)(v2) (Como se expuso en el otro conversatorio por mi compañero)(""cosθ= AB/|A||B|"")

  2. Asignar condiciones en el programa para ciertos valores de la magnitud y el angulo. y así saber una aproximación de a que distancia y a que angulo esta cada vector, la mano estaría abierta y con que valores cerrada.

¡Agradezco la retroalimentación!

AlejaDT commented 3 years ago

Buenas noches, concuerdo con los planteamientos de mis compañeros, en especial con Philip, la implementación de los dedos como vectores es muy útil para poder determinar operaciones con mayor precisión en la detección visual. Ahora bien, si se desea determinar el puntero por direcciones, creería yo que nos podría servir el producto punto entre vectores para determinar su paralelismo y perpendicularidad según sea necesario,

Creación del puntero (dedo índice señalando)

Si se cumple con la suposición de que el dedo pulgar (v1) y el dedo índice (v2) se encuentran en paralelo, esto quiere decir que el producto punto entre dichos vectores debe resultar 0, conservando su dirección hacia arriba generando ángulo con una lineal horizontal imaginaria respecto a los puntos MCP

Tomado del comentario anterior

v1 =sqrt{(1^2)+(2^2)+(3^2)+(4^2)}; v2 =sqrt{(5^2)+(6^2)+(7^2)+(8^2)};

punteroDedoInidice = v1.dot(v2) if (punteroDedoInidice == 0 )

Creación de los dedos hacia abajo (corazón, anular y meñique)

Ahora bien, como los dedos v3, v4y v5 — suposición propia — deben estar hacia abajo, es decir, en dirección opuesta a la que se encuentra inicialmente, se deberían multiplicar los vectores por (-1) y considerar que al doblarlos (en la realidad) los dedos se encuentran en paralelo entre si. De este modo, aplicando lo anterior, tendríamos:

Tomado del comentario anterior

v3 =sqrt{(9^2)+(10^2)+(11^2)+(12^2)}; v4 =sqrt{(13^2)+(14^2)+(15^2)+(16^2)}; v5 =sqrt{(17^2)+(18^2)+(19^2)+(20^2)};

v3op = -1v3 v4op = -1v3 v5op = -1*v3

dedosParalelosv3v4 = v3op.dot(v4op) dedosParalelosv4v5 = v4opdot(v5op)

if (dedosParalelosv3v4 == 0 and dedosParalelosv4v5 == 0)

De esta manera, creando los condicionales que validen los requerimientos para que la figura de la mano se detecte, quedaría:

if (punteroDedoInidice == 0 and (dedosParalelosv3v4 == 0 and dedosParalelosv4v5 == 0))

Nota: Este planteamiento lo oriento a ideales de movimiento en los dedos y su respectivo posicionamiento. Espero sea de utilidad para llegar a una solución más real.

jnavasm commented 3 years ago

Buenas noches, respecto a los planteamientos realizados por mis compañeros destaco las ideas generadas frente a la utilización de los de valores para cada dedo y la implementación del producto cruz que determinaría con claridad hacia donde se esté apuntando, según sea el caso. De igual manera validaría en primera instancia la magnitud con la que cuenta cada vector a través de la formula | Vx |=sqrt((V1^2)+(V2^2)+(V3^2)+(V4^2)) y de esta manera poder validar el ángulo generado entre los respectivos vectores a través del cálculo del coseno. Una vez generados los ángulos se determinaría la posición de la mano y según el producto cruz de los elementos principales se validaría hacia donde apunta.

LauXRS commented 3 years ago

Buenas tardes, analizando los comentarios de mis compañeros, concuerdo que los puntos se deben tomar como vectores, pero no estoy de acuerdo en que solo hallan 5 vectores. en mi opinión cada punto de la mano es un vector independiente, diferente y en distinta ubicación a los demás (20 vectores).

y con respecto a la pregunta general Para detectar que la mano este apuntando, el producto punto de los 8 primeros vectores o puntos (sin incluir el cero) debe ser cero, osea, estos vectores deben ser perpendiculares entre si.

NOTA: llegue a la conclusión que los 20 puntos debemos tomarlos como vectores diferentes, debido a que es posible doblar solo una parte de la articulación y no siempre toda en conjunto

NicolasTorres1007 commented 3 years ago

Buenas Tardes, respecto a lo que LauXRS concluye pienso que no seria necesario tomar cada punto como un vector, simplemente tomamos el TIP con MCP de cada dedo para saber que tanto lo dobla. Además tengo entendido que hay que identificar si la mano apunta o no, entonces solo seria necesario tomar los vectores como [TIP;MCP] de cada dedo, y hacer los cálculos propuestos por mis compañeros, para hallar la dirección de los vectores y así determinar si el dedo esta apuntando o no. Aunque no tengo muy claro como se evidenciaría la posición del dedo gráficamente.

felieg commented 3 years ago

Buenas tardes, de acuerdo a lo mencionado anteriormente en primer lugar estoy de acuerdo que los puntos deben ser vectores en el espacio de una gráfica de tres dimensiones, aunque no deben ser solo 5 ni 20, ya que se tiene 21 puntos en la mano contando el vector de origen, debido a que este vector es la base de los demás vectores y el eje de la mano al girar debe tenerse mas presente el vector de origen.

Con respecto al problema, para saber ello, en mi opinión se deben tomar cada punto como vectores ya que para realizar el movimiento se deben tener las coordenadas y realizar el movimiento de los vectores en la recta de tres dimensiones. Los puntos simultáneamente con el movimiento producirán diferentes ángulos con respecto al punto de origen y los vectores en movimiento. Sin embargo, no entiendo con claridad cuales serian las operaciones para hallar cada una de las posiciones resultantes en los movimientos continuos de los vectores en el recorrido de los dedos.

tatianahenao commented 3 years ago

Buenas tardes, teniendo en cuenta la relacion dada anteriormente, se deberian de tomar 6 vectores teniendo en cuenta el origen ya que como dice NicolasTorres1007 tomando el TIP con MCP sabremos que tanto se puede doblar cada dedo, evitando asi la necesidad de tomar mas de 20 vectores haciendo un poco mas largo el proceso de solucion, con esto se haria mas sencillo el poder identificar si la mano esta apuntando o no ya qye es el fin del ejercicio, realizando los respectivos calculos como lo es el producto punto entre vectores (en este caso los dedos) para determinar su paralelismo entre si usando las formulas propuestas por AlejaDT y las comprobaciones que propone podriamos llegar a una respuesta mas cercana a lo real quedando a mi parecer solamente la incognita de que tanto puede llegar a doblarse los dedos.

Erick1x commented 3 years ago

Buenas tardes, respecto a los planteamientos realizados por mis compañeros estoy de acuerdo con mi compañera Laura en qué cada punto de la mano debe ser tomado como un vector independiente, (osea 21 vectores), y estos vectores estarían conformados por su coordenada en r³, ya después de esto para saber si la mano está apuntando o no podríamos hacer comparaciones entre las coordenadas de los vectores para saber las posiciones exactas de los dedos( no estoy seguro de que operaciones se podrían realizar)

JaimeRamon00 commented 3 years ago

Buenas noches, teniendo en cuenta lo visto en clase y las posiciones expuestas por varios de mis compañeros, me parece que la mejor forma de detectar los gestos de una mano consistiría en calcular los ángulos entre los vectores de los dedos de cada mano; y con éstos datos, podriamos asociar las posiciones de los vectores en el espacio con uno de los 3 gestos asignados previamente en el código,(mano abierta, cerrada y apuntando), haciendo las aproximaciones con las posiciones de los vectores en el gesto.

EstebanArevalo1305 commented 3 years ago

Buenas noches , mirando lo planteamientos de mis compañeros desde mi punto de vista pienso que no se necesitan 21 vectores pues como ya han explicado algunos compañeros usando TIP con MCP sabremos que tanto se doblan los dedos, sin embargo no se que tan exacto seria ese proceso por lo cual no me parecería mal testear el planteamiento de tomar 21 vectores.

EstefaniB commented 3 years ago

Buenas noches, considerando lo dicho anteriormente por mis compañeros hay que considerar que posiblemente tener tanto s vectores podrían complicar la manera como se asocian los vectores pero posiblemente sino se tiene el numero adecuada pueda que no tome de manera adecuada los gestos asignados, también ayudaría el hacer pruebas con distintos números vectores para tener una idea más clara de como funcionaria este.

AdrianaSegura commented 3 years ago

Buenas noches, acorde a los comentarios de mis compañeros tiene relevancia el uso de los 21 vectores de la mano para según las operaciones tener más precisión en la medición de si apunta o no, del mismo modo se debe visualizar un espacio en r3 pues, por el mecanismo de la muñeca y de los dedos hay infinidad de posiciones en las que puede estar. Evaluando los posibles ángulos que se forman entre cada grupo de vectores (dedos), sería posible determinar si se realiza el apuntado.

JoshuaCantillo commented 3 years ago

Buenas noches profesor , con respecto al Issue #8 lo primordial sería hallar la manera de que únicamente con los datos que tenemos de los landmark 5,6,7,8 podamos detectar si se está apuntando o no,para esto la idea que estoy desarrollando aún es la de evaluar el ángulo que se presenta entre el landmark 5 y 6 ,6 y 7 ,7 y 8 . Una vez tenemos el ángulo entre estos puntos podemos realizar una regla de tres básica en dónde cada ángulo se relacionará con un porcentaje respecto a qué tan cerca está de un ángulo llano, por ejemplo si el ángulo llano son 180° y el ángulo que obtuvimos del landmark 7,8 es de 172° podemos hallar el porcentaje de qué tan cerca de encuentra 172 de 180 y así con cada ángulo que obtengamos al final hacemos el promedio y si por ejemplo dicho promedio es superior al 93% significa que la mano está apuntando (creo que me enredé un poco)

Acerca del Issue #9 lo mejor sería hallar el ángulo que se presenta con el landmkar 3 respecto al 0 ya que este tiene menos variaciones en cuánto a rigidez, con este ángulo podemos hacer la misma regla de tres que mencioné anteriormente pero en este caso en relación a noventa grados y fijar un porcentaje para permitir que no sea necesario un ángulo de 90° sino que sea un poco menor.

Otra posible opción es crear un vector que sea paralelo al punto 8 y luego hacer el producto punto entre el vector formado por 2 y 3 y poner un límite ,para que sean paralelos debe ser cero pero podemos poner que sea un valor inferior a 1.3 o algo así.

PaulaV2 commented 3 years ago

Buenas noches, teniendo en cuenta la variedad de ángulos que se pueden formar entre los vectores, considero que es difícil definir con certeza una solución al problema ya que hay diferentes posibilidades algebraicas para resolver el ejercicio, pero leyendo los comentarios lo mas acertado seria tomar los 21 vectores para así tener en cuenta todos los puntos que se encuentran en la mano, debido a que la muñeca y los dedos se pueden encontrar en infinidad de posiciones.

DValenn20 commented 3 years ago

Buenas noches, de acuerdo con lo que planteó un compañero anteriormente, se estiman como vectores los puntos; sin embargo, considero que ello debe realizarse no solo en cada dedo sino en cada uno de los 21 puntos con tres componentes que corresponder a los ejes x,y, z. Además, para el análisis particular del índice apuntado y su relación angular con respecto al pulgar, son necesarios dos vectores más, uno siendo la suma de los vectores del pulgar (vec_thumb=vec1+vec2+vec3+vec4) y el restante, la suma de los vectores del dedo índice (vec_index=vec5+vec6+vec7+vec8). Ahora bien, para que se reconozca la mano específicamente 👉 y no 👆 o 🤚, se necesitan condicionales que restrinjan la identificación del gesto cuando el vector vec9> vec12 y vec13>vec16 y vec17>vec20 en su componente x sin que vec5>vec8 (según las coordenadas NDC de mediapipe indicadas en https://google.github.io/mediapipe/solutions/objectron.html) y que vec2>vec9 en su componente y. Por otra parte, para determinar el ángulo en el que se encuentre el dedo pulgar con respecto al índice se calcula por medio del coseno, mediante la formula: cosθ= AB/|A||B| que para este caso corresponde a: vec_thumbvec_index/| vec_thumb ||vec_index| siendo |vec_thumb|=sqrt{(x^2) +(y^2) +(z^2)} y |vec_index|=sqrt{(x^2) +(y^2) +(z^2)} con el valor de sus respectivas componentes El resultado varía entre 0 y 1, en caso de tener como resultado 0, equivalente en grados a 90º (math.acos ()math.degrees ()), se entiende que un vector se encuentra de manera ortogonal con respecto al otro. Si se obtienen 0º los vectores son paralelos, en este caso el uno de los vectores es múltiplo del otro.

guillermodiaz01 commented 3 years ago

Muy buena noche. Teniendo en cuenta el comentario de mi compañera Paula, no me parece necesario utilizarlos 21 vectores, ya que tomando alguno se puede saber la posición de la mano, hacia donde está apuntando, y se podrían realizar los cálculos solamente con 6 vectores.

BrayanSCastroS commented 3 years ago

Buenas noches, Con respecto al problema de la semana 8 para mi una de las soluciónes para el gesto de mano abierta-mano cerrada, podria ser con el uso de las coordenadas de los puntos (5-9-13 y 17) con respecto al punto (0), de esta forma se generarían 4 vectores con origen en el punto cero y en dirección hacia los puntos (5-9-13 y 17) respectivamente. Pienso que calculando el angulo entre los vectores: θ(V1,V2) , θ(V2,V3) y θ(V3,V4) podriamos generar una regla basado en la variación angular Ej: θ(V1,V2)+θ(V2,V3)= 45° θ(V2,V3)+θ(V3,V4)= 45° Si θ(V,V) + θ(V,V) = 45° (mano-cerrada) Si θ(V,V) + θ(V,V) > 45° (mano-abierta)