{"id":19839152,"url":"https://github.com/dianait/emotion","last_synced_at":"2026-05-09T05:06:26.539Z","repository":{"id":44628070,"uuid":"512841370","full_name":"dianait/Emotion","owner":"dianait","description":"Reconocimiento de imágenes en tiempo real","archived":false,"fork":false,"pushed_at":"2022-07-11T19:50:56.000Z","size":1074,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-28T22:19:56.538Z","etag":null,"topics":["opencv","python","ros","tfg"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dianait.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-07-11T17:00:45.000Z","updated_at":"2023-03-07T15:36:44.000Z","dependencies_parsed_at":"2022-07-15T11:00:29.588Z","dependency_job_id":null,"html_url":"https://github.com/dianait/Emotion","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dianait/Emotion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2FEmotion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2FEmotion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2FEmotion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2FEmotion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dianait","download_url":"https://codeload.github.com/dianait/Emotion/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2FEmotion/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32807862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["opencv","python","ros","tfg"],"created_at":"2024-11-12T12:20:45.383Z","updated_at":"2026-05-09T05:06:26.523Z","avatar_url":"https://github.com/dianait.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Feature matching with FLANN\n\n- Una vez pasadas las dos imágenes a B/N (webcam y plantilla) nos valemos del objeto **ORB** (Oriented FAST and Rotated BRIEF) para detectar los _keypoints_ y descriptores a comparar de ambas imágenes\n  [OpenCV: ORB (Oriented FAST and Rotated BRIEF)](https://docs.opencv.org/3.4/d1/d89/tutorial_py_orb.html)\n\n  ```python\n  detector = cv2.ORB_create(1000);\n  kp1, desc1 = detector.detectAndCompute(frame, None)\n  kp2, desc2 = detector.detectAndCompute(pattern, None)\n  ```\n\n  [FLANN](https://stackoverflow.com/tags/flann/info) (fast approximate nearest-neighbor searches) es una librería que utliza un [algoritmo de búsqueda a partir de los vecinos más cercanos](https://es.wikipedia.org/wiki/K_vecinos_m%C3%A1s_pr%C3%B3ximos) encontrando coincidencias entre dos imágenes dadas\n\n  ```python\n  # Configuración del detector FLANN\n  FLANN_INDEX_LSH = 6\n  index_params= dict(algorithm = FLANN_INDEX_LSH,\n                     table_number = 6,\n                     key_size = 12,\n                     multi_probe_level = 1)\n  search_params=dict(checks=32)\n\n  # Creación del detector\n  matcher = cv2.FlannBasedMatcher(index_params,search_params)\n\n  # Búsqueda de coincidencias a partir de los descriptores hallados con ORB\n  matches = matcher.knnMatch(desc1, desc2, 2)\n  ```\n\n  Los resultados se filtrarán en base a un umbral\n\n  ```python\n  umbral = 0.7\n  good_matches = [m[0] for m in matches \\\n                              if len(m) == 2 and m[0].distance \u003c m[1].distance * umbral]\n\n  # Esta línea creo que equivaldría a esto,\n  # pero por alguna razón funciona mucho mejor el código de arriba:\n  good_matches = []\n  for m,n in matches:\n      if m.distance \u003c umbral * n.distance and len(m) == 2:\n          good_matches.append(m)\n\n  ```\n\n  - Guarda los puntos dónde han habido coincidencias en dos vectores, uno para la imagen fuente y otra para la plantilla\n\n  ```python\n  # Los puntos que hacen match (que estan en good_matches ) de las dos imagenes\n   src_pts = np.float32([ kp1[m.queryIdx].pt for m in good_matches ])\n   dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good_matches ])\n  ```\n\n  - A partir de esta información crea una nueva matriz y una máscara que contempla los cambios de perspectiva con la función _findHomography_\n\n  ```python\n  mtrx, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)\n  ```\n\n  - Después de ésto comprueba que la suma de las coincidencias ( teniendo en cuanta las transformaciones de perspectiva ) sea mayor que el número mínimo de coincidencias que queramos tener ( especificado por nosotros )\n\n  ```python\n  if mask.sum() \u003e self.MIN_MATCH:\n       return True\n  ```\n\n  ...y VOILÀ!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdianait%2Femotion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdianait%2Femotion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdianait%2Femotion/lists"}