def search_destroy(image): "Usa Tracking para seguir al objetivo mientras mueve la torreta y dispara" global p_actual global objetivo global objetivos_destruidos global modo centro_objetivo = Utiles.centro_rectangulo(objetivo) p_actual = Motor_Mockup.desplazamiento(p_actual, centro_objetivo) # Utiles.dibuja_puntos(image, [centro]) # x1, y1, x2, y2 = aume nta_roi(objetivo) # cv.imshow("ROI", roi) # coordenadas_reducidas(image) # cv.waitKey(0) # while True: image, objetivos = Tracker.tracker(image) objetivo = Tracker.actualiza_objetivo(objetivo, objetivos) # image = Utiles.atencion_blur(image, objetivo) Utiles.dibuja_contornos(image, objetivos) Utiles.dibuja_rectangulo(image, objetivo, Config.UI.cyan2) image = Utiles.dibuja_mira(image, p_actual) # Comprueba si se puede disparar p_objetivo = Utiles.centro_rectangulo(objetivo) if (destruccion(p_actual, p_objetivo)): image = cv.putText(image, "Bang!", (p_actual[0] + 5, p_actual[1] - 5), 0, 1, Config.UI.rojo, 2, 16) # Limpia la lista de destruidos y agrega el ultimo TODO mejorar objetivos_destruidos.append(objetivo) if (len(objetivos_destruidos) > 3): objetivos_destruidos.pop(0) modo = Config.Modo.deteccion return image
def actualiza_objetivo(objetivo, objetivos): "Actualiza el objetivo si se mueve" # No hay nuevos objetivos, nos quedamos con el que se detecto if (len(objetivos) < 1): return objetivo # Elimina las detecciones del tracker con area muy distinta del objetivo x, y, w, h = objetivo area_objetivo = w * h rectangulos = Utiles.genera_rectangulos(objetivos) rectangulos = Utiles.elimina_rect_irelevantes(rectangulos, area_objetivo) # Los objetivos no eran suficientemente similares en area if (len(rectangulos) < 1): return objetivo # Cambia el objetivo por el mas cercano detectado por el tracker distancia_max = max(w, h) p_objetivo = Utiles.centro_rectangulo(objetivo) objetivo_alt = Selector.objetivo_prioritario(p_objetivo, rectangulos, distancia_max) if (len(objetivo_alt) > 0): return objetivo_alt # No habia un objetivo lo suficientemete cercano return objetivo